C# 中 多线程同步退出方案 CancellationTokenSource

Posted 仰光博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 中 多线程同步退出方案 CancellationTokenSource相关的知识,希望对你有一定的参考价值。

C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource

 

CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用,需重新初使化对象。

代码示例:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CancellationTokenSourceTest
{
    class Program
    {
        
        static void Main(string[] args)
        {
            //一种多线程取消任务开关对象
            CancellationTokenSource s1 = new CancellationTokenSource();
            CancellationTokenSource s2 = new CancellationTokenSource();

            //s1 , 或者 s2 取消,导致 s3 取消
            CancellationTokenSource s3 = CancellationTokenSource.CreateLinkedTokenSource(s1.Token, s2.Token);

            //取消时执行回调
            s1.Token.Register(new Action(() => {
                Console.WriteLine("线程{0} 执行回调!", System.Threading.Thread.CurrentThread.ManagedThreadId);
            }));

            s2.Token.Register(new Action(() =>
            {
                Console.WriteLine("线程{0} 执行回调!", System.Threading.Thread.CurrentThread.ManagedThreadId);
            }));

            s3.Token.Register(new Action(() =>
            {
                Console.WriteLine("线程{0} 执行回调!", System.Threading.Thread.CurrentThread.ManagedThreadId);
            }));

            //异步执行
            ThreadPool.QueueUserWorkItem(new WaitCallback(Print), s1.Token);
           // System.Threading.Thread.Sleep(2000);
            ThreadPool.QueueUserWorkItem(new WaitCallback(Print), s2.Token);
          //  System.Threading.Thread.Sleep(2000);
            ThreadPool.QueueUserWorkItem(new WaitCallback(Print), s3.Token);


           
            Console.WriteLine();
            s2.CancelAfter(3000); //若各线程传递各自tocken ,执行回调线程:  s2 , s3
            //s1.CancelAfter(3000); //若各线程传递各自tocken ,执行回调线程:  s1 , s3

            //s3.Cancel(); //若各线程传递各自tocken ,只触发 s3 , 不会触发 s1 , s2 回调。

            //注意: 若各线程传递s3.token ,  s1 , s2 任意Cancle , s1 , s2 , s3 均会回调。
            
            Console.ReadKey();
           

        }


        static void Print(object objToken) {
            CancellationToken token = (CancellationToken)objToken;
            Console.WriteLine("Print , 开始等待{0}...", System.Threading.Thread.CurrentThread.ManagedThreadId);
            if (!token.WaitHandle.WaitOne(20000)) {
                Console.WriteLine("未收到信号,超时退出!");
            }
            

            //如下等效
            //while (!token.IsCancellationRequested) {
            //    System.Threading.Thread.Sleep(1000);
            //}

            Console.WriteLine("执行退出 {0}!" , System.Threading.Thread.CurrentThread.ManagedThreadId);
        }

    }
}

 

以上是关于C# 中 多线程同步退出方案 CancellationTokenSource的主要内容,如果未能解决你的问题,请参考以下文章

JAVA多线程之Synchronize 关键字原理

c#多线程

C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)

C# 多线程系列进程同步Mutex类

C#多线程间的同步问题

关于C#的多线程方面