欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#并行庫Task類介紹

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

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

ThreadPool.QueueUserWorkItem(A);

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

Task.Create(A);

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

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

假如我們要創(chuàng)建三個任務(wù),并等待它們完成。這個功能用TheadPool實現(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類實現(xiàn)起來就相對簡單多了:

    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這個是一個成員函數(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í)行一個后續(xù)操作。這也是一個比較有用的功能,由于比較簡單,就不介紹了。

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

TaskManager和TaskManagerPolicy

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

在Task中使用TaskManager非常簡單,只要在創(chuàng)建Task時將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);

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

異常處理

當(dāng)Task在執(zhí)行過程中發(fā)生異常時,該異常會在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類,這個類的功能和用法和Task非常相似,完全可以看做一個帶返回值的Task。示例如下:

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

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

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

相關(guān)文章

  • C#控制Excel Sheet使其自適應(yīng)頁寬與列寬的方法

    C#控制Excel Sheet使其自適應(yīng)頁寬與列寬的方法

    這篇文章主要介紹了C#控制Excel Sheet使其自適應(yīng)頁寬與列寬的方法,涉及C#操作Excel的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • unity 鼠標(biāo)移入彈出UI的操作

    unity 鼠標(biāo)移入彈出UI的操作

    這篇文章主要介紹了unity 鼠標(biāo)移入彈出UI的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#通過屬性名字符串獲取、設(shè)置對象屬性值操作示例

    C#通過屬性名字符串獲取、設(shè)置對象屬性值操作示例

    這篇文章主要介紹了C#通過屬性名字符串獲取、設(shè)置對象屬性值操作,結(jié)合實例形式總結(jié)分析了C#通過反射獲取對象屬性值并設(shè)置屬性值,獲取對象的所有屬性名稱及類型等相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • C#字符串使用密鑰進行加解密

    C#字符串使用密鑰進行加解密

    這篇文章主要為大家詳細(xì)介紹了C#字符串使用密鑰進行加解密的代碼,C#字符串加密和解密實現(xiàn)代碼,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C#實現(xiàn)文件壓縮與解壓的方法示例【ZIP格式】

    C#實現(xiàn)文件壓縮與解壓的方法示例【ZIP格式】

    這篇文章主要介紹了C#實現(xiàn)文件壓縮與解壓的方法,結(jié)合具體實例形式分析了C#針對文件進行zip格式壓縮與解壓縮的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 使用 C# 下載文件的多種方法小結(jié)

    使用 C# 下載文件的多種方法小結(jié)

    本文從最簡單的下載方式開始步步遞進,講述了文件下載過程中的常見問題并給出了解決方案。并展示了如何使用多線程提升 HTTP 的下載速度以及調(diào)用 aria2 實現(xiàn)非 HTTP 協(xié)議的文件下載,對C# 下載文件相關(guān)知識感興趣的朋友一起看看吧
    2021-08-08
  • C#基礎(chǔ)之泛型

    C#基礎(chǔ)之泛型

    泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。接下來通過本文給大家介紹c#基礎(chǔ)之泛型,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • Unity?UGUI的Dropdown下拉菜單組件使用詳解

    Unity?UGUI的Dropdown下拉菜單組件使用詳解

    這篇文章主要為大家介紹了Unity?UGUI的Dropdown下拉菜單組件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • C#使用Fleck實現(xiàn)創(chuàng)建WebSocket服務(wù)器

    C#使用Fleck實現(xiàn)創(chuàng)建WebSocket服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了C#如何使用Fleck實現(xiàn)創(chuàng)建WebSocket服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • WPF+SkiaSharp實現(xiàn)自繪彈幕效果

    WPF+SkiaSharp實現(xiàn)自繪彈幕效果

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF和SkiaSharp實現(xiàn)自制彈幕效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-09-09

最新評論