Использование 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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