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());
            }
        }
相關文章
相關標籤/搜索