小编sch*_*227的帖子

使用 CancellationToken 取消任务而不显式检查任务?

背景:

我有一个 Web 应用程序,它启动长时间运行(和无状态)的任务:

var task = Task.Run(() => await DoWork(foo))

task.Wait();
Run Code Online (Sandbox Code Playgroud)

因为它们长时间运行,我需要能够从单独的 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();
...
}
Run Code Online (Sandbox Code Playgroud)

我觉得这个问题是来自不同足够这一个,因为我明确要求的方式,以尽量减少通话检查取消标记,对此接受的回答,“每一个现在,然后,该函数中,调用token.ThrowIfCancellationRequested( )”

c# task cancellation

4
推荐指数
1
解决办法
2345
查看次数

标签 统计

c# ×1

cancellation ×1

task ×1