#c_sharp #async_await
Есть список задач которые были запущенны при старте приложения и каждая из них не будет выполняется на фоне в бесконечном цикле. все задачи я храню в списке public ListBackGroundTask Когда я закрываю положение что делать с этими задачами например в обработчике FormClosing() Посмотрел в отладчике, статус всех задач на момент закрытия окна TaskStatus = WaitingForActivation. Может надо передавать CancellationToken во все задачи и в FormClosing() вызывать Cancel() у CancellationToken? Инфраструктура с токеном присутствует. Но хотелось бы узнать еще варианты?
Ответы
Ответ 1
В идеале во все задачи нужно передавать CancellationToken, чтобы у них была возможность "узнать" об отмене. Каждая задача может останавливаться либо "мягко", проверяя свойство IsCancellationRequested токена, либо "жестко", вызывая метод ThrowIfCancellationRequested(). При завершении приложения вызываете отмену у соответствующего CancellationTokenSource и ожидаете (await) все задачи, чтобы отловить возможные исключения, и пишете исключения в логи. Обратите внимание, что если какие-то задачи завершаются "жестко", то нужно иметь отдельный блок catch (OperationCanceledException e) where e.CancellationToken == source.Token, чтобы отфильтровывать такие задачи (они хоть и завершились с исключением, но это признак их "жесткого" завершения). На практике же ответ на вопрос больше зависит от ваших требований :).
Комментариев нет:
Отправить комментарий