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

C#并行庫Task類介紹

 更新時(shí)間:2022年06月16日 11:23:19   作者:天方  
這篇文章介紹了C#并行庫Task類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Task和ThreadPool的功能類似,可以用來創(chuàng)建一些輕量級(jí)的并行任務(wù)。對(duì)于將一個(gè)任務(wù)放進(jìn)線程池

ThreadPool.QueueUserWorkItem(A);

這段代碼用Task來實(shí)現(xiàn)的話,方式如下:

Task.Create(A);

這兩端代碼的使用和實(shí)現(xiàn)的功能都十分相似。但和TheadPool相比,Task有著更多的功能,更加方便我們使用。

Task.WaitAll()該函數(shù)的功能是等待多個(gè)任務(wù)等待任務(wù)完成,這在線程同步時(shí)經(jīng)常需要用到。

假如我們要?jiǎng)?chuàng)建三個(gè)任務(wù),并等待它們完成。這個(gè)功能用TheadPool實(shí)現(xiàn)如下:

    using (ManualResetEvent mre1 = new ManualResetEvent(false))
    using (ManualResetEvent mre2 = new ManualResetEvent(false))
    using (ManualResetEvent mre3 = new ManualResetEvent(false))
    {
        ThreadPool.QueueUserWorkItem(delegate
        {
            A();
            mre1.Set();
        });
        ThreadPool.QueueUserWorkItem(delegate
        {
            B();
            mre2.Set();
        });
        ThreadPool.QueueUserWorkItem(delegate
        {
            C();
            mre3.Set();
        });
        WaitHandle.WaitAll(new WaitHandle[] { mre1, mre2, mre3 });
    }

用Task類實(shí)現(xiàn)起來就相對(duì)簡單多了:

    Task t1 = Task.Create(delegate { A(); });
    Task t2 = Task.Create(delegate { B(); });
    Task t3 = Task.Create(delegate { C(); });
    t1.Wait();
    t2.Wait();
    t3.Wait();

或者我們還可以這么寫:

    Task t1 = Task.Create(delegate { A(); });
    Task t2 = Task.Create(delegate { B(); });
    Task t3 = Task.Create(delegate { C(); });
    Task.WaitAll(t1, t2, t3);
  • Task.Cancel和Task.CancelAndWait這個(gè)是一個(gè)成員函數(shù),用于取消已經(jīng)創(chuàng)建的Task,如果該Task正在執(zhí)行中,該函數(shù)并不終止Task的執(zhí)行,只是將IsCanceled屬性設(shè)置為true。
    Task.Cancel和Task.CancelAndWait的區(qū)別在于:Task.CancelAndWait除了取消Task外,還將等待該Task執(zhí)行完成(如果該Task在執(zhí)行中)。

  • Task.ContinueWith該成員函數(shù)的作用是在執(zhí)行完Task后,再執(zhí)行一個(gè)后續(xù)操作。這也是一個(gè)比較有用的功能,由于比較簡單,就不介紹了。

除了上述介紹的幾個(gè)方法外,Task還有一些比較有用的屬性和方法,也非常簡單,直接參看其說明文檔即可。

TaskManager和TaskManagerPolicy

這兩個(gè)類主要是對(duì)Task的策略進(jìn)行管理,主要管理的屬性包括:最少處理Task的處理器個(gè)數(shù)、理想處理Task的處理器個(gè)數(shù)、理想的處理線程數(shù)及優(yōu)先級(jí)幾個(gè)屬性。

在Task中使用TaskManager非常簡單,只要在創(chuàng)建Task時(shí)將manager傳入構(gòu)造函數(shù)中即可。如下例所示:

    var manager = new TaskManager(new TaskManagerPolicy(1, 1,1));
    var t1 = Task.Create(x => Thread.Sleep(2000), manager);
    var t2 = Task.Create(x => Thread.Sleep(2000), manager);

    var start = DateTime.Now;
    Task.WaitAll(t1, t2);
    var end = DateTime.Now;

    Console.WriteLine(end-start);

在這里我將處理線程個(gè)數(shù)設(shè)置了為1,這樣的話,只有一個(gè)線程來處理Task,執(zhí)行這兩個(gè)Task總共花費(fèi)的時(shí)間為4秒;而在使用默認(rèn)manager時(shí)候,這兩個(gè)任務(wù)是并發(fā)執(zhí)行的,只需要兩秒即可執(zhí)行完成。

異常處理

當(dāng)Task在執(zhí)行過程中發(fā)生異常時(shí),該異常會(huì)在Wait或WaitAll函數(shù)中重新throw??梢酝ㄟ^Task的Exception屬性來獲取發(fā)生的異常。

    var t1 = Task.Create(x => { throw new Exception("t1 error occor"); });
    var t2 = Task.Create(x => { throw new Exception("t2 error occor"); });

    try
    {
        Task.WaitAll(t1, t2);
    }
    catch(Exception)
    {
        Console.WriteLine(t1.Exception.InnerException.Message);
        Console.WriteLine(t2.Exception.InnerException.Message);
    }

另外,順帶簡單的介紹一下Future類,這個(gè)類的功能和用法和Task非常相似,完全可以看做一個(gè)帶返回值的Task。示例如下:

    var f1 = Future.Create(() => 3);

    f1.Wait();
    Console.WriteLine(f1.Value);

到此這篇關(guān)于C#并行庫Task類的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 分析C# Dictionary的實(shí)現(xiàn)原理

    分析C# Dictionary的實(shí)現(xiàn)原理

    對(duì)于C#中的Dictionary類相信大家都不陌生,這是一個(gè)Collection(集合)類型,可以通過Key/Value(鍵值對(duì)的形式來存放數(shù)據(jù);該類最大的優(yōu)點(diǎn)就是它查找元素的時(shí)間復(fù)雜度接近O(1)。那么什么樣的設(shè)計(jì)能使得Dictionary類實(shí)現(xiàn)O(1)的時(shí)間復(fù)雜度呢
    2021-06-06
  • .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼

    .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼

    之前在工作中,需要實(shí)現(xiàn)Word打印功能,并且插入圖片。當(dāng)時(shí)采取的方式則是使用書簽進(jìn)行操作。首先在word內(nèi)插入書簽,完成后,存為模板。程序加載該模板,找到書簽,并在指定位置寫入文字即可
    2013-05-05
  • C# 如何規(guī)范的寫 DEBUG 輸出

    C# 如何規(guī)范的寫 DEBUG 輸出

    本文來告訴大家一個(gè)規(guī)范,如何去寫 DEBUG 的輸出。本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-12-12
  • Unity UGUI的Toggle復(fù)選框組件使用詳解

    Unity UGUI的Toggle復(fù)選框組件使用詳解

    這篇文章主要為大家介紹了Unity UGUI的Toggle復(fù)選框組件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • c#定時(shí)運(yùn)行程序分享(定時(shí)程序)

    c#定時(shí)運(yùn)行程序分享(定時(shí)程序)

    寫了一個(gè)小的定時(shí)程序,定時(shí)觸發(fā)后可以按要求運(yùn)行其它代碼,分享一下操作過程,希望能對(duì)大家有幫助
    2014-01-01
  • Unity實(shí)現(xiàn)弧形移動(dòng)效果

    Unity實(shí)現(xiàn)弧形移動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)弧形移動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#執(zhí)行EXE文件與輸出消息的提取操作

    C#執(zhí)行EXE文件與輸出消息的提取操作

    這篇文章主要介紹了C#執(zhí)行EXE文件與輸出消息的提取操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 最新評(píng)論

    平塘县| 唐河县| 岳普湖县| 景泰县| 天全县| 临湘市| 临夏市| 苍溪县| 栾川县| 龙胜| 武定县| 淮安市| 城步| 嘉荫县| 四川省| 曲沃县| 乳山市| 临高县| 菏泽市| 冕宁县| 崇州市| 万宁市| 孝感市| 白山市| 博爱县| 安吉县| 融水| 乃东县| 武强县| 克拉玛依市| 宁武县| 宝坻区| 长垣县| 积石山| 南充市| 柘荣县| 根河市| 南皮县| 清徐县| 贵定县| 无极县|