考虑以下两种通过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的原因).另一方面,调用者不一定知道我们将采用哪种方法,因此无论我们选择哪个选项,他们都必须为OperationCancelledException设置try / catch.
最佳答案 ThrowIfCancellationRequested是为任务延续而设计的.投掷会停止整个连续链(取消处理延续除外).任务中未处理的OperationCancelledException也将取消Task的取消令牌(如果有的话).
在你的情况下,没有任务.您可以自由定义自己的界面.但请记住,无论谁调用你的方法,也应该有办法看看你的操作是否被取消 – 毕竟,如果你拥有的只是同步方法,那么其他东西必定会导致取消.取决于取消的含义,返回错误,空结果,错误或抛出异常(但可能不是OperationCancelledException!)可能每个都有意义 – 你需要根据你正在制作的界面来定制它.