Obl*_*age 6 c# cancellation async-await cancellation-token
考虑以下两种通过 处理取消的方法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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下job.Process(),正在执行一些原子工作,一旦开始就不应该或无法停止,因此它不接受CancellationToken.
是否有任何理由更喜欢其中一种方法而不是另一种?如果是,应该首选哪种方法?
检查IsCancellationRequested()和返回对我来说感觉更干净,因为抛出意味着出了问题,而取消是我们明确计划处理的情况(这就是我们接受的原因CancellationToken)。另一方面,调用者不一定知道我们将采取哪种方法,因此无论OperationCancelledException我们选择哪个选项,他们都必须设置一个 try/catch。
ThrowIfCancellationRequested是为任务延续而设计的。抛出会停止整个延续链(取消处理延续除外)。OperationCancelledException任务中未处理的任务也会取消 的Task取消标记(如果有)。
在你的情况下,没有Task. 您可以自由定义自己的界面。但请记住,无论谁调用您的方法,也应该有办法查看您的操作是否被取消 - 毕竟,如果您拥有的都是同步方法,那么一定是其他原因导致了取消。根据取消的含义,返回错误、空结果、错误或抛出异常(但可能无论如何都不是OperationCancelledException!)可能各自有意义 - 您需要根据您正在制作的界面类型对其进行定制。
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |