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); } }
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); }