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

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

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

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

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

Parallel類提供了For()方法的重載版本,在重載版本中,可以傳遞ParallelOptions類型的參數(shù)。使用ParallelOptions類型,可以傳遞一個CancellationToken參數(shù)。CancellationToken參數(shù)通過創(chuàng)建CancellationTokenSource來生成。由于CancellationTokenSource實現(xiàn)了ICancelableOperation接口,因此可以用CancellationToken注冊,并允許使用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)的實現(xiàn)代碼中,Parallel類驗證CancellationToken的結(jié)果,并取消操作。一旦取消操作,F(xiàn)or()方法就拋出一個OperationCanceledException類型的異常。
由輸出可看出,當(dāng)取消操作時,已啟動的操作允許完成,因為取消操作總是以協(xié)作方式進行,以避免在取消迭代操作的中間泄露資源。

2.任務(wù)的取消

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

    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)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

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

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

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

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

    C#特性 擴展方法

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

    C#中SetStyle的具體使用

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

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

    桶排序是一種快速且高效的排序算法,通過將數(shù)據(jù)分配到有序桶中并分別排序,適合均勻分布數(shù)據(jù),它的時間復(fù)雜度為O(n),但不適合數(shù)據(jù)分布極不均勻或數(shù)據(jù)范圍很大的情況,桶排序算法簡單、易實現(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#移除所有事件綁定的方法,實例分析了C#事件綁定的移除方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#實現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實例解析

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

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

最新評論

福州市| 皋兰县| 永春县| 巧家县| 延川县| 青龙| 东城区| 灌南县| 资兴市| 岱山县| 遂昌县| 汕尾市| 安福县| 乐平市| 武穴市| 同心县| 湘乡市| 辰溪县| 青冈县| 建阳市| 绍兴县| 通海县| 苏州市| 象山县| 安图县| 门源| 安多县| 临猗县| 通州区| 方山县| 河间市| 天峻县| 班戈县| 灯塔市| 聂拉木县| 临夏县| 丹寨县| 南涧| 玛纳斯县| 土默特左旗| 双江|