成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#多線程開發之任務并行庫

開發 后端
使用線程池可以使我們在減少并行度花銷時節省操作系統資源。可認為線程池是一個抽象層,其向程序員隱藏了使用線程的細節,使我們可以專心處理程序邏輯,而不是各種線程問題。

[[422787]]

本文轉載自微信公眾號「Andy阿輝」,作者阿輝 。轉載本文請聯系Andy阿輝公眾號。

之前學習了線程池,知道了它有很多好處。

使用線程池可以使我們在減少并行度花銷時節省操作系統資源。可認為線程池是一個抽象層,其向程序員隱藏了使用線程的細節,使我們可以專心處理程序邏輯,而不是各種線程問題。

但也不是說我們所有的項目中都上線程池,其實它也有很多弊端,比如我們需要自定義使用異步委托的方式才可以將線程中的消息或異常傳遞出來。這些如果在一個大的軟件系統中,會導致軟件結構過于混亂,各個線程之間消息傳遞來傳遞去的,如果發生沒有處理掉的異常,很容易導致軟件出現致命錯誤。

為了解決這個問題,在.Net Framework 4.0中引入了一個新的異步操作的API,它叫任務并行庫(TPL)。

那么接下來,讓我們一起來認識一下這個TPL,看看它到底有什么魔力可以把線程池中的棘手問題解決掉。

任務并行庫

TPL又被認為是線程池的有一個抽象,其對程序員隱藏了線程池交互的底層代碼,并只提供了更方便的細粒度的API。

TPL的核心是任務。一個任務代表一個異步操作,該操作可以通過多種方式運行,可以使用或不使用獨立線程運行。

TPL有一個關鍵優勢,就是一個任務可以通過多種方式和其它任務組合起來。

比如可以同時開啟多個任務,等待所有任務完成,然后運行一個任務對之前所有任務的結果進行一些計算。

可以使用AggregateException來捕獲底層任務內部所有異常,并允許單獨處理這些異常。在C#5.0中已經內置了對TPL的支持,允許我們使用心得await和async關鍵字以平滑的、舒服的方式操作任務。

一、創建任務

可以通過下面三種方式來創建任務。

  1. var a1 = new Task(()=>TastMethod("線程01")); 
  2.       a1.Start(); 
  3.  
  4.       Task.Run(()=>TastMethod("線程001"));    //已棄用 
  5.       Task.Factory.StartNew(()=>TastMethod("線程02")); 
  6.       Task.Factory.StartNew(() => TastMethod("線程03"),TaskCreationOptions.LongRunning); 
  7.  
  8.       Console.ReadKey(); 

在最新的.NET 5.0中已經將任務快速啟動方式Run,丟棄掉了。只能使用其余的兩種。實例化的Tast屬性,必須進行啟動,任務才可以執行。其余的.NET已經做了內置,只需要使用就默認自動開啟。

在線程3開啟過程中,增加了TaskCreationOptions.LongRuning參數,它表示標記該任務為長時間運行,結果該任務將不會使用線程池,而在單獨的線程中運行。然而根據運行該任務的當前任務調度程序,運行方式可能不同。

二、使用任務執行基本操作

下面介紹下從任務中得到其計算法返回的結果。

  1. static void Main(string[] args) 
  2.        {    
  3.            var a1 = new Task<int>(()=>TastMethod("線程01")); 
  4.            a1.Start(); 
  5.            int result = a1.Result;             
  6.            Console.WriteLine("result:" + result); 
  7.            Console.ReadKey(); 
  8.        } 
  9.  
  10.        static int TastMethod(string name)  
  11.        { 
  12.            Console.WriteLine("線程名字:"+name+"Id:"+Thread.CurrentThread.ManagedThreadId+"是否屬于線程池:"+Thread.CurrentThread.IsThreadPoolThread); 
  13.            return 40; 
  14.        } 

輸出結果

這里我們聲明并運行了線程01并等待結果,該任務會被放置在線程池中,并且主線程會等待,直到任務返回前一直處于阻塞狀態。

其實也可以調用方法RunSynchronously()方法,使其特定運行在主線程。這是一個非常好的優化,可以避免使用線程池來執行非常短暫的操作。

三、處理任務中的異常

在異步任務中,對于異常的處理是非常重要的。

  1. try 
  2.     var a1 = new Task<int>(() => TastMethod("線程01",2)); 
  3.     a1.Start(); 
  4.     int result = a1.Result; 
  5.     Console.WriteLine("result:" + result); 
  6. catch (Exception ex) 
  7.     Console.WriteLine(ex.Message); 
  8. }       

當程序啟動時,創建了一個任務并嘗試同步獲取任務結果。Result屬性的Get部分會使當前線程等待直到該任務結束,并將異常傳播給當前線程。此時通過try/catch是很容易捕獲到的(需要注意AggregateExceptiont,它被封裝起來,)。

  1. int result = a1.GetAwaiter().GetResult ; 

上面這種情況無需封裝異常,可以使用GetAwaiter和GetResult方法來訪問任務結果。

 

責任編輯:武曉燕 來源: Andy阿輝
相關推薦

2024-09-29 16:22:18

多線程TaskC#

2024-09-27 19:42:09

工具C#Task?

2019-08-27 21:11:59

HamstersJavaScript多線程

2009-08-12 18:04:44

編寫C#多線程

2023-08-02 09:29:40

任務池TaskPool

2023-08-01 16:35:48

鴻蒙ArkUI應用開發

2024-02-27 10:44:58

C#線程后端

2009-08-17 16:29:56

C#多線程控制

2009-08-28 16:43:57

C#多線程學習

2009-09-04 15:09:48

C#多線程啟動Squa

2021-02-09 09:53:11

C#多線程異步

2024-10-21 16:59:37

C#編程多線程

2009-07-17 10:37:05

C#多線程

2009-08-26 18:13:55

C#多線程lock

2011-04-25 14:42:10

C#lock

2009-08-17 16:56:51

C#多線程控制進度條

2021-11-30 00:12:43

C#多線程循環

2009-08-17 16:49:46

C#多線程控制

2009-08-04 18:00:51

C#線程同步Monitor

2015-11-24 15:13:15

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人精品影院 | 欧美成人黄色小说 | 黄在线 | 午夜精品久久久久久久星辰影院 | 狠狠干综合视频 | 国产精品美女久久久 | 91久久精品一区二区二区 | 精品一区欧美 | 欧美中文字幕在线 | 久久久高清| 亚洲一区二区中文字幕 | 欧美一区二 | 青春草国产 | 国产精品日韩欧美一区二区三区 | 91精品国产乱码久久久久久久久 | 97色在线观看免费视频 | 国产精品18hdxxxⅹ在线 | 亚洲精品久久久久久久久久久久久 | 爱爱免费视频 | 国产精品影视 | 亚洲高清一区二区三区 | 欧美www在线 | 色噜噜色综合 | 国内成人免费视频 | 日韩一级 | 黄网站涩免费蜜桃网站 | 亚洲色图婷婷 | 亚洲精品久久久久avwww潮水 | 欧美网站一区二区 | 国产福利资源在线 | 国产乱码精品1区2区3区 | 自拍偷拍亚洲视频 | 成年视频在线观看 | 91久久国产综合久久91精品网站 | 欧美电影免费网站 | 9久久精品 | 国产中文字幕在线 | 亚洲欧美日韩精品久久亚洲区 | 一区二区免费视频 | 成av在线 | а_天堂中文最新版地址 |