C# 中的 CancellationToken

2024 年 8 月 29 日 | 4 分钟阅读

在本文中,您将学习如何在 C# 中实现 CancellationToken 及其示例。

什么是 CancellationToken?

在 C# 中,用于异步操作的协作取消的强大机制是 CancellationToken 它提供了一种简单的方法来取消不再需要或已超时的操作,它允许一个线程或任务向另一个线程或任务指示它希望取消其操作。 CancellationToken 是 .NET 中任务并行库 (TPL) 的重要组成部分,它提供了一种在各种框架组件中取消异步操作的标准化方式。

终止异步操作的有效方法是使用 CancellationToken 可以协作取消任务和操作,并且可以从程序的任何部分启动取消请求。

关键组件

C# 中的 CancellationToken 包含几个组件。一些主要的组成部分如下:

1. CancellationToken:它表示可用作取消信号的令牌。

2. CancellationTokenSource:创建和处理取消令牌提供了一种取消操作的方法。

注意事项

  1. 响应性:异步操作必须持续检查取消请求,以确保及时响应取消。
  2. 线程安全:CancellationTokenCancellationTokenSource 被设计为线程安全的,允许在多线程场景中安全使用。

特点

C# 中的 CancellationToken 有几个特性。一些主要的关键特性如下:

  1. 协作取消:发出取消请求时,异步进程应检查 CancellationToken 的 IsCancellationRequested 属性并正常退出。
  2. 取消通知:通过检查令牌,任何包含对 CancellationToken 引用的代码都可以在发出取消请求时收到通知。
  3. 异常处理:当请求取消时,操作可能会引发 OperationCanceledException,从而允许正常清理。

好处

C# 中的 CancellationToken 有几个好处。一些主要的关键好处如下:

  1. 正常关机:它允许应用程序响应用户操作或系统事件,正常停止正在进行的操作。
  2. 资源管理:它有助于高效清理与已取消操作相关的资源。
  3. 并发控制:促进并发异步任务之间的协调。

将 CancellationToken 传递给操作

1. 基于任务的方法: CancellationToken 是 .NET 中大多数异步方法接受的可选参数,以允许取消。

例如

2. 取消请求:使用相关 CancellationTokenSource 的 Cancel() 方法向令牌发送取消信号。

处理取消

1. 检查取消:在异步方法中使用 IsCancellationRequested 属性来确定是否正在请求取消。

2. 捕获 OperationCanceledException:将可能导致取消的代码包装在 try-catch 块中,以防止它抛出 OperationCanceledException

示例

让我们举一个例子来说明 C# 中的 CancellationToken

输出

Press Enter to cancel the Task...
The Task is running successfully...
The Task is running successfully...
The Task is running successfully...
The Task is running successfully...
The Task is running successfully...
Press any key to exit...

说明

此 C# 代码演示了如何使用 CancellationToken 轻轻地取消异步活动。首先,必须创建 CancellationTokenSource 并从中获取 CancellationToken。接下来,它启动一个异步任务,在周期性操作时检查取消请求。在用户输入时调用 CancellationTokenSource 上的 Cancel() 会取消任务。最后,它等待任务完成,如果任务在完成之前被取消,则处理 OperationCanceledException

使用场景

当外部事件(例如用户输入、超时或应用程序关闭)需要取消异步操作时,CancellationToken 经常使用。为了防止资源泄漏并确保响应性,它允许应用程序正常终止长时间运行的进程。

结论

总之,C# 的 CancellationToken 提供了一种强大且标准化的机制,用于协作取消异步操作。它通过分发令牌和检查取消请求,确保资源有效性和快速性,同时允许应用程序正常处理取消事件。