在我们的应用程序中,我们经常使用 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 来控制成功取消,而不是仅仅返回一个已完成的 Task。MS 是否有任何具体原因不遵守“不要使用异常来控制执行流程”规则?
以及如何避免在完全无用的 try catch (TaskCancelledException) 块中对每个支持取消的方法(很多)进行装箱?