簡體   English   中英

從頭開始異步處理

[英]Async processing from scratch

我有以下名為Pluck的課程:

internal static void Work()
{
    Task[] tasks = new Task[5];
    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i] = SumAsync();
    }
    Task.WhenAll(tasks);
}

private static async Task<int> SumAsync()
{
    return await Task.Run(() => { return OnePlusOne(); });
}

private static int OnePlusOne()
{  return 1+1;  }

而我的主要方法是:

static void Main(string[] args)
{
    Pluck.Work(); 
}

我錯過了一些東西,因為我在OnePlusOne切換了一個斷點而從未被擊中。

Task.WhenAll(tasks)是一個async方法,因此返回Task 您需要await該任務,以確保僅在所有任務完成后才繼續操作。 當前,您的應用程序可能會在這些任務有機會運行之前結束。

這導致使用async關鍵字標記“ Work ,並使其返回一個Task本身:

internal static async Task WorkAsync()
{
    Task[] tasks = new Task[5];
    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i] = SumAsync();
    }
    await Task.WhenAll(tasks);
}

由於您無法在Main使用await ,因此需要與Wait同步Wait

static void Main(string[] args)
{
    Pluck.WorkAsync().Wait(); 
}

如果在方法中最后要做一次await (如SumAsync和我的WorkAsync ),則可以將其和async關鍵字刪除,而只需返回任務即可。 這會稍微提高性能。 在這里了解更多。


注意:僅在非常特殊的情況下(例如Main ),才應使用Wait阻止任務,因為它可能導致死鎖。 更好的解決方案是使用AsyncContext

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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