最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 使用CancellationTokenSource取消多線程

 更新時(shí)間:2021年08月16日 11:15:03   作者:⎛⎝≥⏝⏝≤⎛⎝⎛⎝≥⏝⏝≤⎛⎝  
有時(shí)間我們?cè)谑褂枚嗑€程的時(shí)候,需要取消線程的執(zhí)行,可以使用CancellationTokenSource來(lái)取消對(duì)Task開(kāi)辟多線程的取消,感興趣的可以了解一下

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

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

 CancellationTokenSource cts ;
        /// <summary>
        /// 開(kāi)啟線程
        /// </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();
 
            //如果放到這里有可能線程還沒(méi)有開(kāi)始執(zhí)行就被取消了
            //cts.Cancel(true);
        }
 
        /// <summary>
        /// 取消線程
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

 

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

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

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

          再去取消線程是沒(méi)有什么意義的。

2: cts.Cancel()

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

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

3:cts.Token.ThrowIfCancellationRequested();

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

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

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

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

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

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

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

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

 CancellationTokenSource cts;
        /// <summary>
        /// 開(kāi)啟線程
        /// </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)被取消,如果取消則自己跑出來(lái)一個(gè)線程
                        if (cts.Token.IsCancellationRequested)
                            throw new OperationCanceledException();
                        MessageBox.Show("線程" + obj + "被執(zhí)行");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("線程" + obj + "被取消");
                    }
 
                }, i, cts.Token);
                task.Start();
            }
            //如果放到這里有可能線程還沒(méi)有開(kāi)始執(zhí)行就被取消了
            //cts.Cancel(true);
        }
 
        /// <summary>
        /// 取消線程
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

到此這篇關(guān)于C# 使用CancellationTokenSource取消多線程的文章就介紹到這了,更多相關(guān)C# 使用CancellationTokenSource取消多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c#剪切板操作的簡(jiǎn)單實(shí)例

    c#剪切板操作的簡(jiǎn)單實(shí)例

    這篇文章介紹了c#剪切板操作的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-11-11
  • ListView Adapter優(yōu)化 實(shí)例

    ListView Adapter優(yōu)化 實(shí)例

    ListView Adapter優(yōu)化 實(shí)例,需要的朋友可以參考一下
    2013-04-04
  • C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)

    C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)

    這篇文章主要介紹了C# 正則表達(dá)式常用的符號(hào)和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • C#使用jQuery實(shí)現(xiàn)無(wú)刷新評(píng)論提交的方法

    C#使用jQuery實(shí)現(xiàn)無(wú)刷新評(píng)論提交的方法

    這篇文章主要介紹了C#使用jQuery實(shí)現(xiàn)無(wú)刷新評(píng)論提交的方法,涉及C#結(jié)合jQuery進(jìn)行Ajax操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法分析

    C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法分析

    這篇文章主要介紹了C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法,結(jié)合實(shí)例形式分析了C#使用HttpWebRequest類與System.IO類實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • c#利用webmail郵件系統(tǒng)發(fā)送郵件示例分享

    c#利用webmail郵件系統(tǒng)發(fā)送郵件示例分享

    在C#中發(fā)送郵件的方式有2種,一種是使用webmail方式進(jìn)行發(fā)送,另外一種就是采用netmail發(fā)送的方式,這篇文章介紹了c#使用webmail方式發(fā)送郵件示例,大家參考使用吧
    2014-01-01
  • C#中string用法實(shí)例詳解

    C#中string用法實(shí)例詳解

    這篇文章主要介紹了C#中string用法,非常詳細(xì)的總結(jié)了比較常見(jiàn)的關(guān)于C#中string的幾個(gè)常用方法,需要的朋友可以參考下
    2014-08-08
  • 最新評(píng)論

    谷城县| 易门县| 航空| 略阳县| 安国市| 涿州市| 牙克石市| 苏尼特右旗| 嘉峪关市| 临安市| 四子王旗| 阿克苏市| 和顺县| 安塞县| 盐池县| 青铜峡市| 夹江县| 巢湖市| 滦南县| 永川市| 淳安县| 九寨沟县| 柳江县| 安乡县| 兴城市| 海南省| 喀喇| 搜索| 广州市| 清镇市| 乌鲁木齐县| 五指山市| 静乐县| 颍上县| 丰顺县| 台安县| 荔浦县| 康马县| 和政县| 垣曲县| 龙南县|