C# 使用多个异步方法
在一個異步方法中,可以調用一個或多個異步方法。如何編寫代碼,取決于一個異步方法的結果是否依靠于另一個異步方法。
01 按順序調用異步方法
使用 await 關鍵字可以調用每個異步方法。在有些情況下,如果一個異步方法依賴另一個異步方法的結果,await 關鍵字就非常有用。在這里,GreetingAsync 異步方法的第二次調用完全獨立于其第一次調用的結果。這樣,如果每個異步方法都不使用 await,那么整個 MultipleAsyncMethods 異步方法將更快地返回結果,如下所示:
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 使用組合器
如果異步方法不依賴于其他異步方法,則每個異步方法都不使用 await,而是把每個異步方法的返回結果賦值給 Task 變量,就會運行得更快。GreetingAsync 方法返回 Task<string>。這些方法現在可以并行運行了。組合器可以幫助實現這一點。一個組合器可以接受多個同一類型的參數,并返回同一類型的值。多個同一類型的參數被組合成一個參數來傳遞。Task 組合器接受多個 Task 對象作為參數,并返回一個 Task。
示例代碼調用 Task.WhenAll 組合器方法,它可以等待,直到兩個任務都完成:
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,是在所有傳入方法的任務都完成了才會返回 Task。從 WhenAny 方法返回的 Task,是在其中一個傳入方法的任務完成了就會返回 Task。
Task 類型的 WhenAll 方法定義了幾個重載版本。如果所有的任務返回相同的類型,那么該類型的數組可用于 await 返回的結果。GreetingAsync 方法返回一個 Task<string>,等待返回的結果是一個字符串(string)形式。因此,Task.WhenAll 可用于返回一個字符串數組:
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]}"); }只有等待的所有任務都完成時某個任務才能繼續,WhenAll 方法就有實際用途。當調用任務在等待完成的任何任務都完成才能執行操作時,可以使用 WhenAny 方法。它可以使用任務的結果繼續。
總結
以上是生活随笔為你收集整理的C# 使用多个异步方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wow,一个免费、不怕打的评论插件!
- 下一篇: C# 使用 ValueTasks