📅  最后修改于: 2023-12-03 15:29:56.144000             🧑  作者: Mango
CancellationToken 是一个重要的概念,它允许您优雅而安全地取消正在执行的操作。在本例中,我们将介绍如何使用 CancellationToken 来取消一个 Task。
创建一个 CancellationToken 非常简单,只需使用 CancellationTokenSource 的 Token 属性即可。以下代码演示如何创建 CancellationToken:
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
接下来,我们将创建一个虚拟的耗时任务,该任务将等待 5 秒钟,然后输出一条消息。在此期间,我们将使用 CancellationToken 来安全地取消任务。以下是该任务的代码:
Task task = Task.Run(() =>
{
for (int i = 0; i < 5; i++)
{
// 在每次迭代之前检查 CancellationToken 是否已被取消。
if (token.IsCancellationRequested)
{
Console.WriteLine("Task 已取消");
// 使用 ThrowIfCancellationRequested() 方法抛出 OperationCanceledException 异常,以提醒发起方任务已取消。
token.ThrowIfCancellationRequested();
}
Thread.Sleep(1000);
}
Console.WriteLine("任务完成");
}, token);
在此示例中,我们将 CancellationToken 传递给 Task 的构造函数,以使任务与 CancellationToken 相关联。在 Task 的操作中,我们使用 IsCancellationRequested 属性来检查 CancellationToken 是否已经请求取消,并使用 ThrowIfCancellationRequested 方法来抛出一个 OperationCanceledException 异常,以提醒发起方任务已取消。
在任务运行时,我们可以调用 CancellationTokenSource 的 Cancel 方法来取消与 CancellationToken 相关联的任务。以下代码演示如何取消任务:
cts.Cancel();
请注意,通过 CancellationToken,我们可以通过安全的方式取消任务。操作取消时,不会导致资源泄漏或不安全的线程状态。
完整示例代码如下:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task task = Task.Run(() =>
{
for (int i = 0; i < 5; i++)
{
// 在每次迭代之前检查 CancellationToken 是否已被取消。
if (token.IsCancellationRequested)
{
Console.WriteLine("Task 已取消");
// 使用 ThrowIfCancellationRequested() 方法抛出 OperationCanceledException 异常,以提醒发起方任务已取消。
token.ThrowIfCancellationRequested();
}
Thread.Sleep(1000);
}
Console.WriteLine("任务完成");
}, token);
Console.WriteLine("请按任意键取消任务");
Console.ReadKey();
cts.Cancel();
Console.WriteLine("按任意键退出程序");
Console.ReadKey();
}
}
以上是 CancellationToken 的示例,它提供了另一种安全和优雅的线程管理方式。