11

.NET 单个异步任务如何同时监听多个取消请求(CancellationToken)

 3 years ago
source link: https://blog.walterlv.com/post/a-single-task-listen-to-multiple-cancellation-requests.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

.NET 单个异步任务如何同时监听多个取消请求(CancellationToken)

2021-06-11 01:13

异步编程中,并不是所有时候 await 等的都是新的异步任务;有时候同一个异步任务可能被多次等待,并且每个等待都可以有自己的取消请求,即 CancellationToken。那么如何在一个异步任务中同时响应多个取消请求呢?


可被多次 await 的单个任务

我们先来列举一个最简单的例子,用来作为多次取消请求的示例。

class WalterlvDemoClass
{
    private readonly CancellationToken _currentCancellationToken = default;

    public async Task DoSomethingAsync(CancellationToken cancellationToken)
    {
        // 省略真正的异步代码。
    }
}

现在,DoSomethingAsync 可能被调用多次,但执行的都是同一件事情。当任务完成时所有 await 全部等待完成,当任务取消时所有 await 全部取消。

合并 CancellationToken

合并 CancellationToken 的方法是:

var token = CancellationTokenSource.CreateLinkedTokenSource(token1, token2)

合并完成后的 CancellationToken 在两者任一个取消时都会被取消。

于是我们前面的 DoSomethingAsync 加一行即可:

    class WalterlvDemoClass
    {
        private readonly CancellationToken _currentCancellationToken = default;

        public async Task DoSomethingAsync(CancellationToken cancellationToken)
        {
++          _currentCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(_currentCancellationToken, cancellationToken);
++
            // 省略真正的异步代码,需要判断取消请求时,判断 _currentCancellationToken。
        }
    }

参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/a-single-task-listen-to-multiple-cancellation-requests.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,或者前往 CSDN 关注我的主页

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK