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

c# 基于任務的異步編程模式(TAP)

 更新時間:2020年11月02日 09:09:18   作者:一只獨行的猿  
這篇文章主要介紹了c# 基于任務的異步編程模式(TAP)的相關資料,幫助大家更好的理解和學習c# 異步編程的相關知識,感興趣的朋友可以了解下

異步編程是C#5.0的一個重要改進,提供兩個關鍵字:async和await。使用異步編程,方法的調(diào)用是在后臺運行(通常在線程或任務的幫助下),但不會阻塞調(diào)用線程。異步模式分為3種:異步模式、基于事件的異步模式和基于任務的異步模式(TAP)。TAP是利用關鍵字async和await實現(xiàn)的,本文將講解TAP模式。async和await關鍵字只是編譯器的功能。編譯器最終會用Task類創(chuàng)建代碼。

1、創(chuàng)建任務

建立一個同步方法Greeting,該方法在等待一段時間后,返回一個字符串。

 private string Greeting(int delay, string name)
 {
  System.Threading.Thread.Sleep(delay);
  return string.Format("Hello, {0}.", name);
 }

定義一個方法GreetingAsync,可以使方法異步化,其傳入的參數(shù)不做強制要求?;谌蝿盏漠惒侥J街付?,并返回一個任務。注意,該方法返回的是Task<string>,定義了一個返回字符串的任務,與同步方法返回值一致。

private Task<string> GreetingAsync(string name, int delay = 3000)
{
 return Task.Run<string>(() =>
 {
  return Greeting(delay, name);
 });
}

2、調(diào)用異步方法

可以使用await關鍵字調(diào)用返回任務的異步方法GreetingAsync。但是,使用await關鍵字的方法必須要用async關鍵字修飾符聲明。在GreetingAsync方法完成前,被async關鍵字修飾的方法內(nèi)await關鍵字后面的代碼不會繼續(xù)執(zhí)行。但是,啟動被async關鍵字修飾的方法的線程可以被重用,而沒有被阻塞。

public async void CallerWithAsync()
{
 string result = await GreetingAsync("Nigel", 2000);
 Console.WriteLine(result);
}

注意:async修飾符修飾只能用于返回Task或void的方法。不能作為程序的入口點,即Main方法不能使用async修飾符。await修飾符只能用于返回Task的方法。

3、延續(xù)任務

GreetingAsync方法返回一個Task<string>對象。該對象包含任務創(chuàng)建的信息,并保存到任務完成。Task類的ContinueWith方法可在任務完成后繼續(xù)調(diào)用的代碼。

public void CallsWithContinuationTask()
 {
  Task<string> task = GreetingAsync("Stephanie", 1000);
  task.ContinueWith(t =>
  {
   Console.WriteLine(t.Result);
  });
 }

實際上,編譯器會把await關鍵字后的所有代碼放進ContinueWith方法內(nèi)。不論是await關鍵字的方法還是任務的ContinueWith方法,在方法的不同生命階段使用了不同的線程。都是當await關鍵字的方法或任務執(zhí)行完畢后,再由另一個線程去執(zhí)行await關鍵字后面的代碼,或給當前線程添加新的任務去執(zhí)行相關代碼。

在具有UI的應用程序中,應用程序的窗體的控件不允許跨線程訪問,需要使用控件的InvokeRequired屬性和Invoke方法,將訪問UI的方法代碼塊以委托的形式傳遞給控件的Invoke,但是在執(zhí)行前需要判斷控件的InvokeRequired。在使用async和await關鍵字,當await完成后,不需要做任何處理,就可以放訪問UI線程(實際上是將控制權又交給了UI線程)。

4、使用多個異步方法

4.1、按順序調(diào)用多個異步方法

使用await關鍵字可以調(diào)用每個異步方法。如果一個異步方法依賴于另一個異步方法,將會起到很大作用。但當異步方法之間沒有相互依賴的時候,不使用await關鍵字將更快返回結果。

public async void MultipleAsyncMethods()
 {
  DateTime start = DateTime.Now;
  string result1 = await GreetingAsync("Jack",2500);//先執(zhí)行完它
  string result2 = await GreetingAsync("Tim",1500);//再執(zhí)行它
  //輸出結果
  Console.WriteLine("Finished both methods: MultipleAsyncMethods.\nResult 1: {0}, Result 2: {1}", result1, result2);
  Console.WriteLine("Use time: {0}", (DateTime.Now - start).TotalMilliseconds);
 }

4.2、使用組合器

如果任務之間并不依賴于另一個任務,每個異步方法都不需要使用await,而是把每個異步方法的返回結果賦值給Task變量,使用組合器讓這些任務并行運行。當組合器內(nèi)的所有任務都完成后,才會執(zhí)行后面的代碼。

public async void MultipleAsyncMethodsWithCombinators1()
{
 DateTime start = DateTime.Now;
 Task<string> t1= GreetingAsync("Jack", 2500);
 Task<string> t2= GreetingAsync("Tim", 1500);
 await Task.WhenAll(t1, t2);
 //輸出結果
 Console.WriteLine("Finished both methods: MultipleAsyncMethodsWithCombinators1.\nResult 1: {0}, Result 2: {1}", t1.Result, t2.Result);
 Console.WriteLine("Use time: {0}", (DateTime.Now - start).TotalMilliseconds);
}

如果所有任務類型都返回相同的類型,則可用該類型的數(shù)組作為await返回的結果

public async void MultipleAsyncMethodsWithCombinators2()
{
 DateTime start = DateTime.Now;
 Task<string> t1 = GreetingAsync("Jack", 2500);
 Task<string> t2 = GreetingAsync("Tim", 1500);
 string[] results= await Task.WhenAll(t1, t2);
 //輸出結果
 Console.WriteLine("Finished both methods: MultipleAsyncMethodsWithCombinators2.\nResult 1: {0}, Result 2: {1}", results[0], results[1]);
 Console.WriteLine("Use time: {0}", (DateTime.Now - start).TotalMilliseconds);
}

5、異步方法的異常處理

如果調(diào)用異步方法,但是沒有等待,那么調(diào)用異步方法的線程中使用傳統(tǒng)的try/catch塊是不能捕獲到異步方法中的異常。因為在異步方法執(zhí)行出現(xiàn)異常之前,已經(jīng)執(zhí)行完畢。

如何捕獲異常見《基于任務的異步編程模式(TAP)的錯誤處理》。

以上就是c# 基于任務的異步編程模式(TAP)的詳細內(nèi)容,更多關于c# 異步編程的資料請關注腳本之家其它相關文章!

相關文章

  • C# 中的 LINQ語法和類型(兩種語法)

    C# 中的 LINQ語法和類型(兩種語法)

    LINQ 允許開發(fā)人員直接在 C# 代碼中編寫查詢,從而更輕松地操作和轉(zhuǎn)換數(shù)據(jù),這篇文章主要介紹了C# 中的 LINQ:語法和類型,需要的朋友可以參考下
    2024-06-06
  • 淺談C# StringBuilder內(nèi)存碎片對性能的影響

    淺談C# StringBuilder內(nèi)存碎片對性能的影響

    這篇文章主要介紹了淺談StringBuilder內(nèi)存碎片對性能的影響,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C#實現(xiàn)JSON解析器MojoUnityJson功能(簡單且高效)

    C#實現(xiàn)JSON解析器MojoUnityJson功能(簡單且高效)

    MojoUnityJson 是使用C#實現(xiàn)的JSON解析器 ,算法思路來自于游戲引擎Mojoc的C語言實現(xiàn) Json.h。這篇文章主要介紹了C#實現(xiàn)JSON解析器MojoUnityJson的方法,需要的朋友可以參考下
    2018-01-01
  • 詳解三種C#實現(xiàn)數(shù)組反轉(zhuǎn)方式

    詳解三種C#實現(xiàn)數(shù)組反轉(zhuǎn)方式

    本篇文章主要介紹了詳解三種C#實現(xiàn)數(shù)組反轉(zhuǎn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • C#壓縮和解壓文件的兩種方法

    C#壓縮和解壓文件的兩種方法

    在C#中,我們可以使用內(nèi)置的System.IO命名空間下的幾個類來處理文件的壓縮和解壓縮,主要涉及到兩個常用的庫:System.IO.Compression和WinRAR,以下是使用這些類進行文件壓縮和解壓縮的基本步驟,需要的朋友可以參考下
    2024-08-08
  • C#實現(xiàn)的簡單整數(shù)四則運算計算器功能示例

    C#實現(xiàn)的簡單整數(shù)四則運算計算器功能示例

    這篇文章主要介紹了C#實現(xiàn)的簡單整數(shù)四則運算計算器功能,涉及C#界面布局、事件響應及數(shù)值運算等相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • C#多線程與跨線程訪問界面控件的方法

    C#多線程與跨線程訪問界面控件的方法

    這篇文章主要介紹了C#多線程與跨線程訪問界面控件的方法,實例分析了C#多線程與跨線程訪問空間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#拷貝整個文件夾及子目錄和其中文件的方法

    C#拷貝整個文件夾及子目錄和其中文件的方法

    這篇文章主要介紹了C#拷貝整個文件夾以及子目錄和其中文件,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Unity實現(xiàn)3D循環(huán)滾動效果

    Unity實現(xiàn)3D循環(huán)滾動效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)3D循環(huán)滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#實現(xiàn)的字符串相似度對比類

    C#實現(xiàn)的字符串相似度對比類

    這篇文章主要介紹了C#實現(xiàn)的字符串相似度對比類,本文直接給出類實現(xiàn)代碼,代碼中包含詳細注釋,需要的朋友可以參考下
    2015-07-07

最新評論