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