public async Task StartActualTaskHandleAsync(List <ITaskWorkHandler> handlers) { if (handlers.Count == 0) { return; } var tasksToRun = _workerRepository.GetNotRunnigTasks();//TODO думаю лучше сразу получать то что можно запустить, получитс так? может хранить дату и при добавлении ее высчитывать? if (tasksToRun.Count == 0) { return; } foreach (var handler in handlers) { var handlerId = handler.GetHandlerId(); var tasksForHandler = tasksToRun.Where(x => x.HandlerId == handlerId); foreach (var task in tasksForHandler) { //TODO тут работа с очередью и потом обновление бд по очереди if (_processTask.ContainsKey(task.Id)) { continue; } try { if (task.NeedHandleNow()) { if (!_processTask.TryAdd(task.Id, task)) { continue; } var taskToSend = task.Clone(); await handler.Handle(taskToSend);//TODO надо ли ждать? task.Status = taskToSend.Status; task.DateOfEnd = DateTime.Now; task.ErrorText = taskToSend.ErrorText; } } catch (Exception e) { task.ErrorText = e.Message; task.Status = TaskToWorkStatus.Error; } await _workerRepository.UpdateAsync(task); _processTask.TryRemove(task.Id, out _); if (task.Recycle) { var newTsk = CloneForNewByOld(task); await AddTaskAsync(newTsk); } } } }