private async Task TaskWork(CashTask cashTask, DateTime?dateTime) { List <string> guids = await GetGuidsAsync(dateTime); List <TextTaskResult> localTasksResults = new List <TextTaskResult>(); //так лучше не делать. Как переписать? using (var scope = _scopeFactory.CreateScope()) { TaskDbContext _context = scope.ServiceProvider.GetRequiredService <TaskDbContext>(); var searchWords = _context.SearchWords.Where(x => x.IdTask == cashTask.Id).ToList(); var unrealizedGuids = guids.Select(x => Guid.Parse(x)); foreach (var guid in unrealizedGuids) { try { //запрос в другой микросервис на работы по guid FindService.Entities.WordMatches findResult = await _findClient.GetById(guid, cashTask.SearchWords); string[] countWord = findResult.Quantity.Split(' '); //записываем результат для этого guid в в локальную переменную for (int i = 0; i < cashTask.SearchWords.Count; i++) { var IdWord = searchWords.First(x => x.Word == cashTask.SearchWords[i]).Id; localTasksResults.Add(new TextTaskResult() { Id = new Guid(), IdTask = cashTask.Id, IdText = guid, IdWord = IdWord, Count = Int32.Parse(countWord[i]) }); } } catch (ApiException ex) { _logger.LogInformation($"TaskWorker|ERROR| Service FindService Ошибка опроса {ex.RequestMessage}. _findClient.GetById(new Guid({guid}), {cashTask.SearchWords}); |{DateTimeOffset.Now}"); } } if (localTasksResults.Count > 0) { await _context.TextTaskResult.AddRangeAsync(localTasksResults); await _context.SaveChangesAsync(); } } }
/// <summary> /// Доделываем работу (при ошибках, и нестабильной работы) /// </summary> private async Task FinishUnrealizedWork() { List <string> guids = await GetGuidsAsync(null); List <TextTaskResult> tasksResults; //получаем из таблицы TextTaskResult выполненые данные по задачам //так лучше не делать. Как переписать? using (var scope = _scopeFactory.CreateScope()) { TaskDbContext _context = scope.ServiceProvider.GetRequiredService <TaskDbContext>(); tasksResults = _context.TextTaskResult.ToList(); //.Where(x => получить список только тех iD task,которые в кеше // слова с idTask'ом var searchWords = _context.SearchWords.ToList(); //.Where .... только для idTask которые в работе List <TextTaskResult> unrealizedTasksResults = new List <TextTaskResult>(); foreach (var task in _cacheTaskService.cashTaskGetAll()) { // не приближаем будущее, оно и так настанет // не учитываем задачи из будушего if (task.StartTime.ToLocalTime() > DateTime.Now) { task.State = TaskFlags.New; continue; } //получаем список текстов по которым задача отработала var texts = tasksResults.Where(x => x.IdTask == task.Id).Select(x => x.IdText); //получаем список неотработанных guids для текущей задачи, по ним отрабатываем, и записываем в локальную переменную, а далее в базу var unrealizedGuids = guids.Select(x => Guid.Parse(x)).Except(texts); foreach (var item in unrealizedGuids) { try { //запрос в другой микросервис на работы по guid FindService.Entities.WordMatches findResult = await _findClient.GetById(item, task.SearchWords); string[] countWord = findResult.Quantity.Split(' '); //записываем результат для этого guid в локальную переменную for (int i = 0; i < task.SearchWords.Count; i++) { unrealizedTasksResults.Add(new TextTaskResult() { Id = new Guid(), IdTask = task.Id, IdText = item, IdWord = searchWords.First(x => x.IdTask == task.Id && x.Word == task.SearchWords[i]).Id, Count = Int32.Parse(countWord[i]) }); } } catch (ApiException ex) { _logger.LogInformation($"TaskWorker|ERROR| Service FindService Ошибка опроса {ex.RequestMessage}. _findClient.GetById(new Guid({item}), {task.SearchWords}); |{DateTimeOffset.Now}"); } } } if (unrealizedTasksResults.Count > 0) { await _context.TextTaskResult.AddRangeAsync(unrealizedTasksResults); await _context.SaveChangesAsync(); } } //end FinishUnrealizedWork }