Использование CancellationToken для отмены задачи без явной проверки внутри задачи?C#

Место общения программистов C#
Anonymous
Использование CancellationToken для отмены задачи без явной проверки внутри задачи?

Сообщение Anonymous »

Справочная информация:

У меня есть веб-приложение, которое запускает долго выполняющиеся (и не сохраняющие состояние) задачи:

Код: Выделить всё

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

Вернуться в «C#»