簡體   English   中英

Foreach異步C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM