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

C#多線程之取消架構(gòu)介紹

 更新時(shí)間:2022年04月13日 10:16:03   作者:Ruby_Lu  
這篇文章介紹了C#多線程之取消架構(gòu),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

.NET 4.5 中包含取消架構(gòu),允許以標(biāo)準(zhǔn)方式取消長(zhǎng)時(shí)間運(yùn)行的任務(wù)。每個(gè)阻塞調(diào)用都應(yīng)支持這種機(jī)制。但目前,并不是所有阻塞調(diào)用都實(shí)現(xiàn)了這個(gè)新技術(shù)。已經(jīng)實(shí)現(xiàn)了這種機(jī)制的技術(shù)有任務(wù)(http://m.fzitv.net/article/244285.htm),并發(fā)集合類(http://m.fzitv.net/article/244141.htm),并行LINQ(http://m.fzitv.net/article/244216.htm)和幾種同步機(jī)制。
取消架構(gòu)基于協(xié)作行為,它不是強(qiáng)制的。長(zhǎng)時(shí)間運(yùn)行的任務(wù)會(huì)檢查它是否被取消,并返回控制權(quán)。
支持取消的方法接受一個(gè)CancellationToken參數(shù)。這個(gè)類定義了IsCancellationRequested屬性,其中長(zhǎng)時(shí)間運(yùn)行的操作可以檢查它是否應(yīng)終止。使用Register()方法注冊(cè)一個(gè)將在取消此 System.Threading.CancellationToken 時(shí)調(diào)用的委托。它在調(diào)用Cancel()方法取消操作時(shí)調(diào)用。

1.Parallel.For()方法的取消

Parallel類提供了For()方法的重載版本,在重載版本中,可以傳遞ParallelOptions類型的參數(shù)。使用ParallelOptions類型,可以傳遞一個(gè)CancellationToken參數(shù)。CancellationToken參數(shù)通過(guò)創(chuàng)建CancellationTokenSource來(lái)生成。由于CancellationTokenSource實(shí)現(xiàn)了ICancelableOperation接口,因此可以用CancellationToken注冊(cè),并允許使用Cancle(),CancleAfter()等方法取消操作。
示例:

    static void CancelParallelFor()
        {
            var cts = new CancellationTokenSource();
            cts.Token.Register( ()=> Console.WriteLine("token canceled!"));

            cts.CancelAfter(1000);

            try
            {
                ParallelLoopResult plr =
                    Parallel.For(0, 100, new ParallelOptions { CancellationToken = cts.Token },
                    x => {
                        Console.WriteLine("loop {0} started", x);
                        Thread.Sleep(1000);
                        Console.WriteLine("loop {0} fininshed!", x);
                    });
            }
            catch (OperationCanceledException ex)
            {
                Console.WriteLine(ex.Message);

            }
        }

輸出:

在For循環(huán)的實(shí)現(xiàn)代碼中,Parallel類驗(yàn)證CancellationToken的結(jié)果,并取消操作。一旦取消操作,F(xiàn)or()方法就拋出一個(gè)OperationCanceledException類型的異常。
由輸出可看出,當(dāng)取消操作時(shí),已啟動(dòng)的操作允許完成,因?yàn)槿∠僮骺偸且詤f(xié)作方式進(jìn)行,以避免在取消迭代操作的中間泄露資源。

2.任務(wù)的取消

任務(wù)的取消類似Parallel.For()方法的取消。首先,創(chuàng)建一個(gè)CancellationTokenSource。如果只需要一個(gè)取消標(biāo)記,可以訪問(wèn)Task.Factory.CancellationToken,以使用默認(rèn)的取消標(biāo)記。任務(wù)通過(guò)TaskFactory對(duì)象接受取消標(biāo)記。在構(gòu)造函數(shù)中,把取消標(biāo)記賦予TaskFactory。這個(gè)取消標(biāo)記又任務(wù)用于檢查CancellationToken的IsCancellationRequested屬性,以確定是否請(qǐng)求了取消。
示例:

    static void CancelTask()
        {
            var cts = new CancellationTokenSource();

            cts.Token.Register(() => Console.WriteLine("task cancelled!"));

            cts.CancelAfter(2000);
            


            try
            {
                Task t = Task.Run(() =>
                {
                    CancellationToken token = cts.Token;
                    Console.WriteLine("task stared!");
                    for (int i = 0; i < 20; i++)
                    {
                        Thread.Sleep(500);
                        if (cts.IsCancellationRequested)
                        {
                            Console.WriteLine("cancelled!");
                            token.ThrowIfCancellationRequested();//拋出異常
                            break;
                        }
                        Console.WriteLine("in loop!");
                    }
                }, cts.Token);
                t.Wait();
            }
            catch (AggregateException ex)
            {
                Console.WriteLine("exception:{0},{1}",ex.GetType().Name,ex.Message);
                foreach (var innerEx in ex.InnerExceptions)
                {
                    Console.WriteLine("exception:{0},{1}", ex.InnerException.GetType().Name, ex.InnerException.Message);
                }
            }
        }

輸出:

到此這篇關(guān)于C#多線程之取消架構(gòu)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中的Task.Delay()和Thread.Sleep()區(qū)別(代碼案例)

    C#中的Task.Delay()和Thread.Sleep()區(qū)別(代碼案例)

    Task.Delay(),async/await和CancellationTokenSource組合起來(lái)使用可以實(shí)現(xiàn)可控制的異步延遲。本文通過(guò)多種代碼案例給大家分析C#中的Task.Delay()和Thread.Sleep()知識(shí),感興趣的朋友一起看看吧
    2021-06-06
  • C#文件下載實(shí)例代碼(適用于各個(gè)瀏覽器)

    C#文件下載實(shí)例代碼(適用于各個(gè)瀏覽器)

    本文給大家分享一段實(shí)例代碼關(guān)于css實(shí)現(xiàn)文件下載功能,需要的的朋友參考下吧
    2017-05-05
  • Dynamic和Var的區(qū)別及dynamic使用詳解

    Dynamic和Var的區(qū)別及dynamic使用詳解

    C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動(dòng)態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的,下面通過(guò)本文給大家介紹Dynamic和Var的區(qū)別及如何正確使用dynamic,需要的朋友參考下
    2016-01-01
  • .NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實(shí)例方法

    .NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實(shí)例方法

    .NET創(chuàng)建、刪除、復(fù)制文件夾及其子文件的實(shí)例方法,需要的朋友可以參考一下
    2013-03-03
  • C#特性 擴(kuò)展方法

    C#特性 擴(kuò)展方法

    在我們的編程生涯中我們要使用很多很多類庫(kù),這些類庫(kù)有的是我們自己開(kāi)發(fā)的,我們有她的代碼,有的是第三方發(fā)布的,我們不僅沒(méi)有他們的代碼,連看的機(jī)會(huì)都沒(méi)有
    2014-12-12
  • C#中SetStyle的具體使用

    C#中SetStyle的具體使用

    本文主要介紹了C#中SetStyle的具體使用,該方法用于啟用或禁用特定的控件樣式,以控制控件的行為和外觀,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • C#實(shí)現(xiàn)桶排序算法的示例代碼

    C#實(shí)現(xiàn)桶排序算法的示例代碼

    桶排序是一種快速且高效的排序算法,通過(guò)將數(shù)據(jù)分配到有序桶中并分別排序,適合均勻分布數(shù)據(jù),它的時(shí)間復(fù)雜度為O(n),但不適合數(shù)據(jù)分布極不均勻或數(shù)據(jù)范圍很大的情況,桶排序算法簡(jiǎn)單、易實(shí)現(xiàn),可調(diào)整桶的大小和數(shù)量以適應(yīng)不同數(shù)據(jù),感興趣的可以了解一下
    2024-10-10
  • c#轉(zhuǎn)義字符串中的所有正則特殊字符方法示例

    c#轉(zhuǎn)義字符串中的所有正則特殊字符方法示例

    這篇文章主要介紹了c#轉(zhuǎn)義字符串中的所有正則特殊字符,大家可以參考使用
    2013-12-12
  • C#移除所有事件綁定的方法

    C#移除所有事件綁定的方法

    這篇文章主要介紹了C#移除所有事件綁定的方法,實(shí)例分析了C#事件綁定的移除方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#實(shí)現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實(shí)例解析

    C#實(shí)現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實(shí)例解析

    這篇文章主要介紹了C#實(shí)現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實(shí)例解析,包括websocket sharp組件的概念及使用方法,需要的朋友可以參考下
    2017-04-04

最新評(píng)論

蛟河市| 荣昌县| 浮山县| 邹城市| 孟村| 博湖县| 宣恩县| 凌海市| 迭部县| 乌审旗| 梅河口市| 朝阳市| 曲靖市| 泗水县| 玉溪市| 金塔县| 鹿泉市| 新丰县| 商洛市| 孟州市| 屏东市| 壶关县| 牟定县| 黔西| 临朐县| 彭泽县| 宕昌县| 泗洪县| 巴彦县| 苍梧县| 开阳县| 安塞县| 融水| 盐源县| 永善县| 五大连池市| 体育| 茂名市| 株洲市| 高碑店市| 玉树县|