Пример #1
0
        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);
                    }
                }
            }
        }