CancellationTokenSource
是 .NET 中用于生成取消标记 (CancellationToken
) 的类之一。它允许您创建一个可用于请求取消操作的取消标记,以便您的应用程序能够响应取消请求。
以下是关于 CancellationTokenSource
的一些关键信息:
-
创建
CancellationTokenSource
对象: 要创建一个CancellationTokenSource
对象,只需使用new
关键字来实例化它,如下所示:CancellationTokenSource cts = new CancellationTokenSource();
-
生成取消标记:
CancellationTokenSource
对象通过其Token
属性生成一个取消标记。这个标记可以传递给需要检查取消请求的方法,以便它们可以在取消请求时停止执行。CancellationToken token = cts.Token;
-
请求取消操作: 当您想要取消某个操作时,可以调用
CancellationTokenSource
的Cancel
方法,如下所示:cts.Cancel();
这将导致与
CancellationToken
关联的操作抛出OperationCanceledException
,表明操作已被取消。 -
取消多个操作: 您可以使用同一个
CancellationTokenSource
来取消多个操作。只需将同一个取消标记传递给这些操作,然后在取消请求时调用Cancel
方法即可。 -
检查取消请求: 在执行可能需要取消的操作时,通常会在操作的主要执行代码中多次检查取消标记,以查看是否已请求取消。这可以通过
token.IsCancellationRequested
属性来完成。if (token.IsCancellationRequested) { // 执行取消操作 }
-
释放资源: 当不再需要取消标记时,应调用
CancellationTokenSource
的Dispose
方法来释放资源。这是很重要的,特别是在长时间运行的应用程序中,以确保不会发生资源泄漏。cts.Dispose();
CancellationTokenSource
可用于多线程应用程序和异步操作中,使您能够安全地取消执行中的操作,以提高应用程序的健壮性和可靠性。
以下是一个简单的示例,演示如何使用 CancellationTokenSource
来取消一个正在运行的任务。在这个示例中,我们将创建一个可以取消的计数器任务,以便在需要时停止计数。
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 创建 CancellationTokenSource 对象
var cts = new CancellationTokenSource();
// 获取取消标记
CancellationToken token = cts.Token;
// 启动一个计数器任务
var task = StartCounterAsync(token);
Console.WriteLine("按下 Enter 键来取消计数器任务...");
Console.ReadLine();
// 请求取消任务
cts.Cancel();
try
{
// 等待任务完成(如果已经完成则不等待)
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("任务已取消.");
}
}
static async Task StartCounterAsync(CancellationToken token)
{
try
{
for (int i = 0; i < 100; i++)
{
// 检查取消请求
token.ThrowIfCancellationRequested();
Console.WriteLine($"计数: {i}");
await Task.Delay(1000); // 模拟一秒钟的工作
}
}
catch (OperationCanceledException)
{
Console.WriteLine("计数器任务已取消.");
}
}
}
在这个示例中,我们创建了一个 CancellationTokenSource
对象 cts
和与之关联的取消标记 token
。然后,我们启动了一个异步任务 StartCounterAsync
,它会计数并在取消请求时抛出 OperationCanceledException
。
在 Main
方法中,我们等待用户按下 Enter 键来取消任务。一旦取消被请求,我们调用 cts.Cancel()
来请求任务取消。然后,我们等待任务完成,如果任务已取消,将捕获 OperationCanceledException
并显示相应的消息。
这个示例展示了如何使用 CancellationTokenSource
和取消标记来控制异步任务的取消。这对于需要响应用户操作或其他外部事件来取消操作的情况非常有用。