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

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

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

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

1、創(chuàng)建任務(wù)

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

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

定義一個(gè)方法GreetingAsync,可以使方法異步化,其傳入的參數(shù)不做強(qiáng)制要求?;谌蝿?wù)的異步模式指定,并返回一個(gè)任務(wù)。注意,該方法返回的是Task<string>,定義了一個(gè)返回字符串的任務(wù),與同步方法返回值一致。

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

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

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

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

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

3、延續(xù)任務(wù)

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

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

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

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

4、使用多個(gè)異步方法

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

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

public async void MultipleAsyncMethods()
 {
  DateTime start = DateTime.Now;
  string result1 = await GreetingAsync("Jack",2500);//先執(zhí)行完它
  string result2 = await GreetingAsync("Tim",1500);//再執(zhí)行它
  //輸出結(jié)果
  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、使用組合器

如果任務(wù)之間并不依賴于另一個(gè)任務(wù),每個(gè)異步方法都不需要使用await,而是把每個(gè)異步方法的返回結(jié)果賦值給Task變量,使用組合器讓這些任務(wù)并行運(yùn)行。當(dāng)組合器內(nèi)的所有任務(wù)都完成后,才會(huì)執(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);
 //輸出結(jié)果
 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);
}

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

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);
 //輸出結(jié)果
 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塊是不能捕獲到異步方法中的異常。因?yàn)樵诋惒椒椒▓?zhí)行出現(xiàn)異常之前,已經(jīng)執(zhí)行完畢。

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

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

相關(guān)文章

  • C#實(shí)現(xiàn)圖像銳化的方法

    C#實(shí)現(xiàn)圖像銳化的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)圖像銳化的方法,涉及C#操作圖像的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • Unity3D撤回命令開發(fā)詳解

    Unity3D撤回命令開發(fā)詳解

    這篇文章主要為大家詳細(xì)介紹了Unity3D撤回命令開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Unity3D基于OnGUI實(shí)時(shí)顯示FPS

    Unity3D基于OnGUI實(shí)時(shí)顯示FPS

    這篇文章主要介紹了Unity3D基于OnGUI實(shí)時(shí)顯示FPS,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • c# 多線程環(huán)境下控制對共享資源訪問的解決方法

    c# 多線程環(huán)境下控制對共享資源訪問的解決方法

    這篇文章主要介紹了c# 多線程環(huán)境下控制對共享資源訪問的解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • C# NullReferenceException解決案例講解

    C# NullReferenceException解決案例講解

    這篇文章主要介紹了C# NullReferenceException解決案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • WinForm實(shí)現(xiàn)的圖片拖拽與縮放功能示例

    WinForm實(shí)現(xiàn)的圖片拖拽與縮放功能示例

    這篇文章主要介紹了WinForm實(shí)現(xiàn)的圖片拖拽與縮放功能,結(jié)合具體實(shí)例形式分析了WinForm鼠標(biāo)事件響應(yīng)及圖片元素動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C# 如何使用ajax請求

    C# 如何使用ajax請求

    這篇文章主要介紹了C# 如何使用ajax請求,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#手工雙緩沖技術(shù)用法實(shí)例分析

    C#手工雙緩沖技術(shù)用法實(shí)例分析

    這篇文章主要介紹了C#手工雙緩沖技術(shù)用法,實(shí)例分析了手工雙緩沖技術(shù)的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C#日期時(shí)間格式化小結(jié)

    C#日期時(shí)間格式化小結(jié)

    這篇文章主要介紹了C#中的時(shí)間與日期的格式化方法,需要的朋友可以參考下
    2013-09-09
  • 解決C#運(yùn)行程序修改數(shù)據(jù)后數(shù)據(jù)表不做更新的問題

    解決C#運(yùn)行程序修改數(shù)據(jù)后數(shù)據(jù)表不做更新的問題

    近日,在使用C#連接數(shù)據(jù)庫的時(shí)候,對數(shù)據(jù)庫中的表做更新后,在當(dāng)前啟動(dòng)項(xiàng)目中去顯示表數(shù)據(jù)時(shí)雖然會(huì)發(fā)生一個(gè)更新,但是在結(jié)束程序運(yùn)行后再去觀察數(shù)據(jù)表中的記錄時(shí)發(fā)現(xiàn)并沒有發(fā)生一個(gè)變化,所以本文給大家解決一下這個(gè)問題,需要的朋友可以參考下
    2023-08-08

最新評論

德庆县| 长宁区| 襄城县| 金坛市| 岑溪市| 松潘县| 伊金霍洛旗| 神木县| 蛟河市| 广州市| 泰兴市| 唐河县| 芒康县| 祁门县| 海林市| 文山县| 海口市| 定兴县| 长沙县| 综艺| 滨海县| 太仓市| 泸定县| 紫阳县| 临武县| 洛隆县| 衡东县| 宜宾市| 蒙山县| 沛县| 忻州市| 西安市| 荥经县| 华安县| 金秀| 寻乌县| 临泽县| 延安市| 昌吉市| 大埔区| 宁陕县|