【发布时间】:2016-03-21 01:42:33
【问题描述】:
在我们的应用程序中,我们经常使用 async / await 和 Tasks。因此它确实经常使用 Task.Run,有时还使用内置的 CancellationToken 支持取消。
public Task DoSomethingAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
while (true)
{
if (cancellationToken.IsCancellationRequested) break;
//do some work
}
}, cancellationToken);
}
如果我现在使用 CancellationToken 取消执行,则执行会在下一个循环开始时停止,或者如果任务根本没有启动,它会引发异常(Task.Run 中的 TaskCanceledException)。现在的问题是为什么 Task.Run 使用 Exception 来控制成功取消,而不是仅仅返回一个已完成的任务。 MS 没有遵守“不要使用异常来控制执行流程”规则是否有任何具体原因?
我怎样才能避免在一个完全无用的 try catch (TaskCancelledException) 块中对每个支持取消(很多)的方法进行装箱?
【问题讨论】:
-
“取消!=成功完成”。您希望
Task<string>取消后返回什么? -
使用 cancellationTokenSource.Cancel(); 取消的任务实例将具有 TaskStatus.RanToCompletion 状态,而不是 TaskStatus .Canceled 状态。
-
您是正确的具有返回值的任务需要例外。没想到。
-
我已经回答了类似的问题here 不确定这是否重复。尤其是this comment 应该会有所启发。
-
@S.Dav 这取决于任务是使用
ThrowIfCancellationRequested还是在令牌设置为 true 时简单地返回。
标签: c# async-await task-parallel-library cancellation-token