📜  CancellationToken 示例 - C# (1)

📅  最后修改于: 2023-12-03 15:29:56.144000             🧑  作者: Mango

CancellationToken 示例 - C#

CancellationToken 是一个重要的概念,它允许您优雅而安全地取消正在执行的操作。在本例中,我们将介绍如何使用 CancellationToken 来取消一个 Task。

创建 CancellationToken

创建一个 CancellationToken 非常简单,只需使用 CancellationTokenSource 的 Token 属性即可。以下代码演示如何创建 CancellationToken:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
任务(Task)

接下来,我们将创建一个虚拟的耗时任务,该任务将等待 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 的示例,它提供了另一种安全和优雅的线程管理方式。