悟生慧

 

C# 实现一个可取消的多线程操作 示例

        private void button1_Click(object sender, EventArgs e)
        {
            //定义一个为可取消资源标志
            CancellationTokenSource cts = new CancellationTokenSource();
            //定义二个为可取消资源标志
            CancellationTokenSource cts1 = new CancellationTokenSource();

            //实现一个可取消操作的回调函数,
            ThreadPool.QueueUserWorkItem(o => Count(cts.Token, 1000000));

            //为可取消资源标志注册取消后的回调函数(无参,无返回值,匿名委托)
            cts.Token.Register(() => Console.WriteLine("Canceled 1"));            

            //为可取消资源标志注册取消后的回调函数(有参,无返回值,显式申明委托)
            cts.Token.Register(o => TestCancellationMethead(1000, 10), true);

            cts1.Token.Register(() => Console.WriteLine("Canceled 2"));

            ///连接两个可取消资源标志
            var LinkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, cts1.Token);
            ///给连接后的可取消资源标志集注册回调函数(匿名委托),集合中任意一个可取消资源标志取消,都将触发该回调函数
            LinkedCts.Token.Register(() => Console.WriteLine("linkedCts canceled"));
            Thread.Sleep(300);
            cts.Cancel();
        }


        void TestCancellationMethead(int x, int y)
        {
            Console.WriteLine("取消后的回调函数" + x + y);
        }

        /// <summary>
        /// 一个可取消操作的回调函数,函数的关键是传入一个CancellationToken对象
        /// </summary>
        /// <param name="token"></param>
        /// <param name="countTo"></param>
        void Count(CancellationToken token, Int32 countTo)
        {
            Console.WriteLine("一个可取消的操作开始执行");
            for (int count = 0; count < countTo; count++)
            {
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("$" + count.ToString());
                    Console.ReadLine();
                    break;
                }
                Console.WriteLine("|" + count.ToString());
                Console.ReadLine();
            }
        }

 

        bool IsCancellationRequested = false;

        private void button2_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(o => Count(1000000));
            Thread.Sleep(300);
            IsCancellationRequested = true;
        }

        void Count(Int32 countTo)
        {
            Console.WriteLine("一个可取消的操作开始执行");
            for (int count = 0; count < countTo; count++)
            {
                if (IsCancellationRequested)
                {
                    Console.WriteLine("一个可取消的操作被取消" + count.ToString());
                    break;
                }
                Console.WriteLine(count.ToString());
            }
        }

 

posted on 2016-06-03 11:02  悟生慧  阅读(1660)  评论(0编辑  收藏  举报

导航