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