Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Что делать с незавершенными Task-ами при закрытии приложения?

#c_sharp #async_await


Есть список задач которые были запущенны при старте приложения и каждая из них не
будет выполняется на фоне в бесконечном цикле. все задачи я храню в списке

public List BackGroundTask


Когда я закрываю положение что делать с этими задачами например в обработчике 

FormClosing()


Посмотрел в отладчике, статус всех задач на момент закрытия окна
TaskStatus = WaitingForActivation. Может надо передавать CancellationToken во все
задачи и в FormClosing() вызывать Cancel() у CancellationToken? Инфраструктура с токеном
присутствует. Но хотелось бы узнать еще варианты?
    


Ответы

Ответ 1



В идеале во все задачи нужно передавать CancellationToken, чтобы у них была возможность "узнать" об отмене. Каждая задача может останавливаться либо "мягко", проверяя свойство IsCancellationRequested токена, либо "жестко", вызывая метод ThrowIfCancellationRequested(). При завершении приложения вызываете отмену у соответствующего CancellationTokenSource и ожидаете (await) все задачи, чтобы отловить возможные исключения, и пишете исключения в логи. Обратите внимание, что если какие-то задачи завершаются "жестко", то нужно иметь отдельный блок catch (OperationCanceledException e) where e.CancellationToken == source.Token, чтобы отфильтровывать такие задачи (они хоть и завершились с исключением, но это признак их "жесткого" завершения). На практике же ответ на вопрос больше зависит от ваших требований :).

Комментариев нет:

Отправить комментарий