背景:
我有一个Web应用程序,可以启动长时间运行(无状态)的任务:
var task = Task.Run(() => await DoWork(foo))
task.Wait();
因为它们运行时间较长,我需要能够从单独的 Web 请求中取消它们。
为此,我想使用 CancellationToken,并在令牌被取消后立即抛出异常。但是,根据我所读到的,任务取消是合作式的,这意味着运行任务的代码必须显式地检查令牌,以查看是否已发出取消请求(例如
CancellationToken.ThrowIfCancellation()
)。我想避免在各处检查
CancellationToken.ThrowIfCancellation()
,因为任务相当长并且经过许多函数。我认为我可以通过创建一个显式的Thread
来完成我想要的操作,但我真的想避免手动线程管理。话虽如此...问题:
当任务被取消时,是否可能自动抛出异常?如果不行,是否有任何良好的替代方法(模式等)来减少代码中的
CancellationToken.ThrowIfCancellation()
?我想避免像这样的东西:
async Task<Bar> DoWork(Foo foo)
{
CancellationToken.ThrowIfCancellation()
await DoStuff1();
CancellationToken.ThrowIfCancellation()
await DoStuff2();
CancellationToken.ThrowIfCancellation()
await DoStuff3();
...
}
我认为这个问题与这个足够不同,因为我明确要求一种最小化检查取消令牌调用的方法,而被接受的答案回应道:“在函数内部时不时地调用token.ThrowIfCancellationRequested()”
Task
有点违背了它的目的。