public async Task <bool> Handle(Message message)
        {
            var currentUser = _currentTelegramUserProvider.GetCurrentTelegramRozkladUser();

            LongLastingUserActionArguments userLongLastingActionArguments = null;
            ILongLastingUserActionHandler  handler = null;

            try
            {
                bool isHandled = false;

                userLongLastingActionArguments = await _longLastingUserActionManager.GetUserLongLastingAction(currentUser);

                if (userLongLastingActionArguments == null)
                {
                    return(isHandled);
                }

                userLongLastingActionArguments.Parameters[typeof(Message)] = message;
                handler   = _longLastingUserActionHandlerFactory.GetHandler(userLongLastingActionArguments);
                isHandled = await handler.Handle(userLongLastingActionArguments);

                return(isHandled);
            }
            catch (Exception e)
            {
                await _longLastingUserActionManager.ClearUserAction(currentUser);

                var currentUserTelegramId = currentUser.TelegramId;
                var outException          = new LongLastingUserActionHandlerException(currentUserTelegramId, e);

                var messageId       = message.MessageId;
                var messageFromUser = message.From;
                var messageText     = message.Text;

                _logger.LogError(TelegramLogEvents.LongLastingUserActionError, outException,
                                 "Current user telegram id: {currentUserTelegramId}. " +
                                 "userLongLastingActionArguments: {userLongLastingActionArguments}. " +
                                 "handler: {handler}. " +
                                 "Telegram message id : {messageId}. " +
                                 "Message from user: {messageFromUser}. " +
                                 "Message text: {messageText}",
                                 currentUserTelegramId, userLongLastingActionArguments, handler, messageId, messageFromUser,
                                 messageText);

                return(false);
            }
        }
예제 #2
0
        public async Task LongLastingUserActionManagerMultiThreadStressTest(int userCount)
        {
            var users = GetDifferentUsers(userCount);
            var usersLongLastingActionArguments = new LongLastingUserActionArguments[userCount];
            var random          = new Random();
            var eachTasksNumber = userCount * 10;

            for (var i = 0; i < userCount; i++)
            {
                usersLongLastingActionArguments[i] = GetUserActionArguments(users[i]);
            }

            var upsertingTasks = new Task[eachTasksNumber];

            Parallel.For(0, eachTasksNumber, i =>
            {
                var task = Task.Run(async() =>
                {
                    await Task.Delay(random.Next(100, 3000));
                    await _manager.UpsertUserAction(usersLongLastingActionArguments[random.Next(0, userCount)]);
                });
                upsertingTasks[i] = task;
            });

            var gettingUserActionArgsTasks = new Task[eachTasksNumber];

            Parallel.For(0, eachTasksNumber, i =>
            {
                var task = Task.Run(async() =>
                {
                    await Task.Delay(random.Next(100, 3000));
                    await _manager.GetUserLongLastingAction(users[random.Next(0, userCount)]);
                });

                gettingUserActionArgsTasks[i] = task;
            });

            var clearingUserActionArgsTasks = new Task[eachTasksNumber];

            Parallel.For(0, eachTasksNumber, i =>
            {
                var task = Task.Run(async() =>
                {
                    await Task.Delay(random.Next(100, 3000));
                    await _manager.ClearUserAction(users[random.Next(0, userCount)]);
                });

                clearingUserActionArgsTasks[i] = task;
            });

            var clearOldValuesTasks = new Task[eachTasksNumber];

            Parallel.For(0, eachTasksNumber, i =>
            {
                var task = Task.Run(async() =>
                {
                    await Task.Delay(random.Next(100, 1000));
                    await _manager.ClearOldValues();
                });

                clearOldValuesTasks[i] = task;
            });

            var tasksList = new List <Task[]>();

            tasksList.Add(upsertingTasks);
            tasksList.Add(gettingUserActionArgsTasks);
            tasksList.Add(clearingUserActionArgsTasks);
            tasksList.Add(clearOldValuesTasks);

            var allTasksArray = new Task[eachTasksNumber * 4];

            long multiplier = 0;

            foreach (var t in tasksList)
            {
                for (long j = 0; j < eachTasksNumber; j++)
                {
                    allTasksArray[j + multiplier] = t[j];
                }

                multiplier += eachTasksNumber;
            }

            // Parallel.For(0, allTasksArray.Length, i => allTasksArray[i].Start());

            await Task.WhenAll(allTasksArray);
        }