У меня есть веб-приложение, которое запускает долго выполняющиеся (и не сохраняющие состояние) задачи:
Код: Выделить всё
var task = Task.Run(() => await DoWork(foo))
task.Wait();
Для этого я хотел бы использовать CancellationToken и просто генерировать исключение, как только токен будет отменен. Однако, судя по тому, что я прочитал, отмена задачи является кооперативной, то есть код, который выполняет задача, должен явно проверять токен, чтобы увидеть, был ли сделан запрос на отмену (например, CancellationToken.ThrowIfCancellation())
Я бы хотел избежать повсеместной проверки CancellationToken.ThrowIfCancellation(), поскольку задача довольно длинная и выполняется через множество функций. Я думаю, что смогу добиться того, чего хочу, создав явный поток, но мне бы очень хотелось избежать ручного управления потоками. Тем не менее...
Вопрос:
Можно ли автоматически генерировать исключение в задаче при ее отмене, и если нет, есть ли какие-нибудь хорошие альтернативы (шаблоны и т. д.), чтобы уменьшить загрязнение кода с помощью CancellationToken.ThrowIfCancellation()?
Я бы хотел чтобы избежать чего-то подобного:
Код: Выделить всё
async Task DoWork(Foo foo)
{
CancellationToken.ThrowIfCancellation()
await DoStuff1();
CancellationToken.ThrowIfCancellation()
await DoStuff2();
CancellationToken.ThrowIfCancellation()
await DoStuff3();
...
}
Я чувствую, что этот вопрос существенно отличается от этого, потому что я явно прошу найти способ минимизировать количество вызовов для проверки токена отмены, на который принятый ответ отвечает: «Время от времени внутри функций вызывайте token.ThrowIfCancellationRequested()»
Подробнее здесь: https://stackoverflow.com/questions/571 ... -within-th
Мобильная версия