溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#怎么同時(shí)取消多個(gè)線程

發(fā)布時(shí)間:2021-08-16 14:58:47 來源:億速云 閱讀:161 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C#怎么同時(shí)取消多個(gè)線程”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#怎么同時(shí)取消多個(gè)線程”吧!

目錄
  • 幾點(diǎn)關(guān)鍵問題解釋:

  • 同時(shí)取消多個(gè)線程:

有時(shí)間我們?cè)谑褂枚嗑€程的時(shí)候,需要取消線程的執(zhí)行,可以使用CancellationTokenSource來取消對(duì)Task開辟多線程的取消

如下:我們點(diǎn)擊一個(gè)按鈕開啟線程,然后點(diǎn)擊取消按鈕取消該線程的執(zhí)行

C#怎么同時(shí)取消多個(gè)線程

 CancellationTokenSource cts ;
        /// <summary>
        /// 開啟線程
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            //重新實(shí)例化cts.Token就會(huì)不一樣,不然再次點(diǎn)擊的時(shí)候會(huì)報(bào)錯(cuò),提示線程已經(jīng)執(zhí)行完畢
            cts = new CancellationTokenSource();
 
            Task task = new Task(() =>
            {
                Thread.Sleep(1500);
 
                try
                {
                    cts.Token.ThrowIfCancellationRequested();
                    MessageBox.Show("線程被執(zhí)行");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("線程被取消");
                }
 
            }, cts.Token);
            task.Start();
 
            //如果放到這里有可能線程還沒有開始執(zhí)行就被取消了
            //cts.Cancel(true);
        }
 
        /// <summary>
        /// 取消線程
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

 C#怎么同時(shí)取消多個(gè)線程

幾點(diǎn)關(guān)鍵問題解釋:

 1:為什么線程里邊去調(diào)用 Thread.Sleep(1500);

          因?yàn)槿绻蛔尵€程暫停一下,你在點(diǎn)擊開啟線程后。還沒有來得及點(diǎn)擊取消線程,線程都已經(jīng)執(zhí)行完畢了這個(gè)時(shí)候

          再去取消線程是沒有什么意義的。

2: cts.Cancel()

          這句話其實(shí)只是設(shè)置一個(gè)狀態(tài),設(shè)置該對(duì)象一個(gè)熟悉為true而已,也就是設(shè)置cts.IsCancellationRequested為ture。

          所以他根本沒有真正的去取消線程的執(zhí)行,只是設(shè)置一個(gè)狀態(tài)而已。

3:cts.Token.ThrowIfCancellationRequested();

          因?yàn)樯厦嬲f的cts.Cancel()只是設(shè)置一個(gè)狀態(tài)而已,線程不會(huì)真正被取消。其實(shí)線程開啟后,現(xiàn)在都是要執(zhí)行完的,

         我們并不能真正去取消線程的執(zhí)行,只是從邏輯上去取消線程需要處理的邏輯。

         這句話的意思其實(shí)就是檢查cts.Cancel()設(shè)置的屬性狀態(tài),也就是cts.IsCancellationRequested是否為true,如果為

         true就拋出一個(gè)異常,從而終止線程的執(zhí)行

         也就是說其實(shí)這句話完全可以我們自己來實(shí)現(xiàn)

C#怎么同時(shí)取消多個(gè)線程

同時(shí)取消多個(gè)線程:

同時(shí)取消多個(gè)線程,其實(shí)也很簡(jiǎn)單,我們不需要有多少個(gè)線程就去實(shí)例化多少個(gè)CancellationTokenSource,

多個(gè)線程綁定頂一個(gè)CancellationTokenSource的token然后調(diào)用該對(duì)象的cancel就可以同時(shí)取消多個(gè)線程了。

 CancellationTokenSource cts;
        /// <summary>
        /// 開啟線程
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            //重新實(shí)例化cts.Token就會(huì)不一樣,不然再次點(diǎn)擊的時(shí)候會(huì)報(bào)錯(cuò),提示線程已經(jīng)執(zhí)行完畢
            cts = new CancellationTokenSource();
 
            for (int i = 0; i < 5; i++)
            {
                Task task = new Task((obj) =>
                {
                    Thread.Sleep(1500);
 
                    try
                    {
                        //cts.Token.ThrowIfCancellationRequested();
                        //檢查狀態(tài),檢查線程是否已經(jīng)被取消,如果取消則自己跑出來一個(gè)線程
                        if (cts.Token.IsCancellationRequested)
                            throw new OperationCanceledException();
                        MessageBox.Show("線程" + obj + "被執(zhí)行");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("線程" + obj + "被取消");
                    }
 
                }, i, cts.Token);
                task.Start();
            }
            //如果放到這里有可能線程還沒有開始執(zhí)行就被取消了
            //cts.Cancel(true);
        }
 
        /// <summary>
        /// 取消線程
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

C#怎么同時(shí)取消多個(gè)線程

感謝各位的閱讀,以上就是“C#怎么同時(shí)取消多個(gè)線程”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C#怎么同時(shí)取消多個(gè)線程這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI