06 CancellationToken中止线程

在 C# 中优雅地终止线程可以通过使用 CancellationToken 实现。CancellationToken 是一种线程安全的机制,用于在多个线程之间传递取消操作信号。下面是一个使用 CancellationToken 优雅地终止线程的示例。

使用 CancellationToken 终止线程

  1. 创建 CancellationTokenSourceCancellationToken
    首先,需要创建一个 CancellationTokenSource 对象,它包含一个 CancellationTokenCancellationToken 是线程之间传递取消信号的关键。

    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken token = cts.Token;
    
  2. 在线程中检查 CancellationToken
    在要执行的线程中定期检查 CancellationTokenIsCancellationRequested 属性。如果该属性为 true,则线程应当优雅地终止其操作。

    void DoWork(CancellationToken token)
    {
        while (true)
        {
            if (token.IsCancellationRequested)
            {
                Console.WriteLine("Cancellation requested, stopping work.");
                break;
            }
            
            // 模拟一些工作
            Console.WriteLine("Working...");
            Thread.Sleep(1000);
        }
    }
    
  3. 启动线程并传递 CancellationToken
    启动一个新的线程并传递 CancellationToken 作为参数。

    Thread workerThread = new Thread(() => DoWork(token));
    workerThread.Start();
    
  4. 请求取消操作
    在需要终止线程时,调用 CancellationTokenSourceCancel 方法。这会设置 CancellationTokenIsCancellationRequested 属性为 true,从而通知线程终止其操作。

    // 让线程运行一段时间
    Thread.Sleep(5000);
    
    // 请求取消操作
    cts.Cancel();
    
    // 等待线程终止
    workerThread.Join();
    Console.WriteLine("Worker thread has been terminated.");
    

完整代码示例

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建 CancellationTokenSource
        CancellationTokenSource cts = new CancellationTokenSource();
        CancellationToken token = cts.Token;

        // 启动工作线程
        Thread workerThread = new Thread(() => DoWork(token));
        workerThread.Start();

        // 让线程运行一段时间
        Thread.Sleep(5000);

        // 请求取消操作
        cts.Cancel();

        // 等待线程终止
        workerThread.Join();
        Console.WriteLine("Worker thread has been terminated.");
    }

    static void DoWork(CancellationToken token)
    {
        while (true)
        {
            if (token.IsCancellationRequested)
            {
                Console.WriteLine("Cancellation requested, stopping work.");
                break;
            }

            // 模拟一些工作
            Console.WriteLine("Working...");
            Thread.Sleep(1000);
        }
    }
}

在这个示例中,工作线程每隔一秒钟检查一次 CancellationToken 是否已请求取消。如果请求取消,线程将优雅地停止工作并退出循环。主线程在等待5秒钟后请求取消操作并等待工作线程终止。通过这种方式,可以实现线程的优雅终止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值