C# 使用多个异步方法
在一個(gè)異步方法中,可以調(diào)用一個(gè)或多個(gè)異步方法。如何編寫代碼,取決于一個(gè)異步方法的結(jié)果是否依靠于另一個(gè)異步方法。
01 按順序調(diào)用異步方法
使用 await 關(guān)鍵字可以調(diào)用每個(gè)異步方法。在有些情況下,如果一個(gè)異步方法依賴另一個(gè)異步方法的結(jié)果,await 關(guān)鍵字就非常有用。在這里,GreetingAsync 異步方法的第二次調(diào)用完全獨(dú)立于其第一次調(diào)用的結(jié)果。這樣,如果每個(gè)異步方法都不使用 await,那么整個(gè) MultipleAsyncMethods 異步方法將更快地返回結(jié)果,如下所示:
private async static void MultipleAsyncMethods() {string sl = await GreetingAsync("Stephanie"); string s2 = await GreetingAsync("Matthias");Console.WriteLine($"Finished both methods.{Environment.NewLine) " +$"Result 1: {s1}{Environment.NewLine} Result 2:{s2}"); }02 使用組合器
如果異步方法不依賴于其他異步方法,則每個(gè)異步方法都不使用 await,而是把每個(gè)異步方法的返回結(jié)果賦值給 Task 變量,就會(huì)運(yùn)行得更快。GreetingAsync 方法返回 Task<string>。這些方法現(xiàn)在可以并行運(yùn)行了。組合器可以幫助實(shí)現(xiàn)這一點(diǎn)。一個(gè)組合器可以接受多個(gè)同一類型的參數(shù),并返回同一類型的值。多個(gè)同一類型的參數(shù)被組合成一個(gè)參數(shù)來(lái)傳遞。Task 組合器接受多個(gè) Task 對(duì)象作為參數(shù),并返回一個(gè) Task。
示例代碼調(diào)用 Task.WhenAll 組合器方法,它可以等待,直到兩個(gè)任務(wù)都完成:
private?async?static?void?MultipleAsyncMethodsWithCombinators1() {Task<string> tl?= GreetingAsync("Stephanie");Task<string> t2 = GreetingAsync("Matthias");?await?Task.WhenAll(t1, t2);Console.WriteLine($"Finished both methods.{Environment.NewLine) " +$"Result?1:{t1.Result}{Environment.NewLine}?Result?2:?{t2.Result}"); }Task 類定義了 WhenAll 和 WhenAny 組合器。從 WhenAll 方法返回的 Task,是在所有傳入方法的任務(wù)都完成了才會(huì)返回 Task。從 WhenAny 方法返回的 Task,是在其中一個(gè)傳入方法的任務(wù)完成了就會(huì)返回 Task。
Task 類型的 WhenAll 方法定義了幾個(gè)重載版本。如果所有的任務(wù)返回相同的類型,那么該類型的數(shù)組可用于 await 返回的結(jié)果。GreetingAsync 方法返回一個(gè) Task<string>,等待返回的結(jié)果是一個(gè)字符串(string)形式。因此,Task.WhenAll 可用于返回一個(gè)字符串?dāng)?shù)組:
private?async?static?void?MultipleAsyncMethodsWithCombinators2() {Task<string>?t1?=?GreetingAsync("Stephanie");?Task<string> t2 = GreetingAsync("Matthias");?string[]?result = await?Task.WhenAll(t1,?t2);Console.WriteLine($"Finished both methods.{Environment.NewLine} " +$"Result?1:{result[0]}{Enviornment.NewLine}?Result?2:{result[1]}"); }只有等待的所有任務(wù)都完成時(shí)某個(gè)任務(wù)才能繼續(xù),WhenAll 方法就有實(shí)際用途。當(dāng)調(diào)用任務(wù)在等待完成的任何任務(wù)都完成才能執(zhí)行操作時(shí),可以使用 WhenAny 方法。它可以使用任務(wù)的結(jié)果繼續(xù)。
總結(jié)
以上是生活随笔為你收集整理的C# 使用多个异步方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Wow,一个免费、不怕打的评论插件!
- 下一篇: c# char unsigned_dll