问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C# CancellationToken 深度解析:原理、使用场景与最佳实践

创作时间:
作者:
@小白创作中心

C# CancellationToken 深度解析:原理、使用场景与最佳实践

引用
CSDN
1.
https://blog.csdn.net/farway000/article/details/138174167

CancellationToken是C#异步编程中用于控制异步操作取消的重要机制。本文将深入解析CancellationToken的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和应用这一机制。

什么是CancellationToken?

在C#中,异步编程通常涉及长时间运行的操作,而CancellationToken提供了一种轻量级的协作取消机制。它允许创建者向所有相关操作发送取消请求,而每个操作则负责以适当的方式响应这个请求。

基本心智模型

  • 创建者:使用CancellationTokenSource创建取消令牌,并在需要时调用Cancel方法。
  • 监听者:接收令牌并监控其状态,通过检查IsCancellationRequested属性或注册回调等方式响应取消请求。

.NET的实现

.NET通过两个类来实现取消机制:

  • CancellationTokenSource:负责创建取消令牌并发送取消请求。
  • CancellationToken:用于监听取消状态。

此外,监听者还可以选择抛出OperationCancelledException异常,以明确表示取消操作。

使用示例

下面是一个使用CancellationToken的示例代码:

public async Task CancellableMethod()
{
    var tokenSource = new CancellationTokenSource();
    for (int i = 0; i < 10; ++i)
    {
        Task.Run(() => DoSomeWork(tokenSource.Token), tokenSource.Token);
    }
    tokenSource.Cancel();
}

public async Task DoSomeWork(CancellationToken ct)
{
    int maxIterations = 100;
    for (int i = 0; i < maxIterations; ++i)
    {
        if (ct.IsCancellationRequested)
        {
            Console.WriteLine("Task cancelled.");
            ct.ThrowIfCancellationRequested();
        }
    }
}

监听和响应取消请求

监听者可以采用以下几种方式监听取消请求:

  • 轮询:定期检查IsCancellationRequested属性。
  • 注册回调:使用Register方法注册回调函数。
  • 等待句柄:使用等待句柄(本文未详细展开)。

同时监听多个令牌

可以使用CancellationTokenSource.CreateLinkedTokenSource方法将多个令牌链接在一起,从而同时监听多个取消源。

推荐模式

  1. 知道何时已过不可取消点:如果操作已经产生副作用,应确保在取消时能够恢复到一致状态。
  2. 传播CancellationToken:将令牌传递给所有接受它的方法。
  3. 完成工作后不要抛出OperationCancelledException:返回成功结果,让调用方决定后续操作。
  4. 输入验证:在取消检查之前进行输入验证。
  5. 考虑不检查令牌:如果工作量很小,可以省略显式检查。

处理取消异常

  • 捕获OperationCanceledException:确保正确处理取消异常,避免遗漏。
  • 清理和重新抛出:在需要清理的情况下,确保正确重新抛出异常。

参考资料

  1. Microsoft官方文档:取消托管线程
  2. CancellationToken的最佳实践
  3. Andrew Lock的博客:在MVC控制器中使用CancellationToken

总结

本文详细介绍了CancellationToken的工作原理、使用方法以及最佳实践,对于希望深入理解C#异步编程的开发者来说,是一篇非常有价值的参考文章。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号