[英]Foreach async c#
想象一下,我有一個具有相同異步方法的類的列表,我可以在列表上分別進行操作:
public async Task Test()
{
foreach (var runner in _runners)
{
await runner.Test();
}
}
但我也可以:
public void Test()
{
_runners.ForEach(async runner => await runner.Test());
}
在這種情況下,不再需要我的測試方法是異步的。 但是,這兩種方法會產生相同的效果嗎?
好吧,據我了解,相當於您編寫的代碼(異步運行程序=>等待運行程序.Test())將是
public static async void Do(Runner r)
{
await r.Test();
}
因此,您不會等待Do方法(它是異步void),而在第一個版本中,您實際上僅在上一個結束之后才執行下一個任務。
我的測試方法不再需要異步了
我認為它看起來像這樣,只是因為在任何地方都沒有顯式的異步void,如果使用命名方法重寫它,將更容易看到。
不同之處在於:
您可以等待第一種情況下返回的任務,然后等待第二種情況下的“解雇”:
public async void TestCaller()
{
await Test();
// do things after all runners completed
}
當您調用async void
方法時,您必須自己處理異常,否則它們將被吞噬。 您將重寫第二種情況,例如:
public void Test()
{
_runners.ForEach(async runner => {
try { await runner.Test(); }
catch (Exception e) { Console.Writeln(e.ToString()); }
});
}
看起來不太好。
同樣,在第一種情況下,每個任務都等待上一個任務的結束,而在第二種情況下,則不是(感謝Scott Chamberlain在評論中糾正了我)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.