Рассмотрим два следующих подхода к обработке отмены через CancellationToken
:
public async Task DoAllAvailableWork(CancellationToken cancelToken)
{
foreach (var job in GetAllAvailableWork())
{
await job.Process();
if (cancelToken.IsCancellationRequested())
return;
}
}
public async Task DoAllAvailableWork(CancellationToken cancelToken)
{
foreach (var job in GetAllAvailableWork())
{
await job.Process();
cancelToken.ThrowIfCancellationRequested();
}
}
В этом случае job.Process()
выполняет некоторую атомарную работу, которая не должна или не может быть остановлена после ее начала, поэтому она делаетне принять CancellationToken
.
Есть ли основания предпочитать один из этих подходов другому?Если да, какой подход следует предпочесть?
Проверка IsCancellationRequested()
и возвращение мне кажутся чище, в том смысле, что бросание подразумевает, что что-то пошло не так, и отмена - это случай, который мы явно планировали обработать (этопочему мы принимаем CancellationToken
).С другой стороны, вызывающий абонент не обязательно может знать, какой подход мы выберем, поэтому он должен настроить try / catch для OperationCancelledException
независимо от того, какой вариант мы выберем.