Есть ли способ в Asp. Net взаимодействовать с фоновым потоком, выполняющим Parallel.Foreach - PullRequest
0 голосов
/ 05 мая 2020

Сценарий

  1. Сервер должен обработать набор отчетов, каждый из которых содержит n количество сотрудников
  2. Пользовательский интерфейс принимает кучу входных данных и запускается вызов для обработки отчетов
  3. Вызов процесса на сервере ставится в очередь фонового потока с использованием HostingEnvironment.QueueBackgroundWorkItem
  4. Функция, выполняемая в этом фоновом потоке, использует Parallel.ForEach для распараллеливания обработки отчетов logi c
  5. Пользовательский интерфейс в основном показывает простую сетку, содержащую список отчетов, и каждый отчет имеет статус , который получает обновления с сервера через SignalR

Проблема здесь в том, что нам нужна возможность отменять каждый отчет из пользовательского интерфейса. Но логи обработки отчетов c находится внутри Parallel.ForEach. Я видел документацию относительно CancellationToken, но это сломает всю l oop. Я ищу способ взаимодействия с каждой задачей, выполняющейся в пределах Parallel.ForEach, и указание, нужно ли ее отменить, когда из пользовательского интерфейса поступает запрос на отмену.

Возможно ли это вообще? Или есть другой подход?

1 Ответ

0 голосов
/ 05 мая 2020

Посмотрите документацию здесь относительно обработки исключений в параллельном l oop. Фактически вы можете построить его так, чтобы выброшенное исключение могло быть перехвачено внутри итерации l oop, и у вас был некоторый контроль над тем, что перехватывать когда.

Затем создайте структуру данных, которая содержит Task, CancellationTokenSource и способ идентифицировать отчет, к которому она привязана. Настройте каждую задачу в этой структуре с ее собственным CancellationTokenSource, настройте токен отмены для задачи на основе этого источника и настройте своего фонового рабочего для итерации по коллекции этой структуры и запуска задачи оттуда. Затем, если вам нужно отменить, вы можете получить доступ к содержащейся структуре в коллекции по идентификатору, перевернуть источник токена на отмену с помощью метода CancellationTokenSource.Cancel(), и задача остановится и выдаст исключение OperationCanceledException, которое вы можете поймать в l oop повторение и игнорирование.

...