[英]Handling Expensive process with Task.WhenAll and Task.WaitAll in MVC
[英]Task.WaitAll vs await Task.WhenAll and threads
我預計Main
方法工作的線程將忙於執行Task.WaitAll
並且 n-1 個線程將保留 rest 個任務,其中 n 是系統中的最大 CPU 線程數。 而在使用await Task.WhenAll
的情況下, Main
方法所在的線程不會忙於執行await Task.WhenAll
,n 個線程將保留 rest 個任務。 但實際上沒有區別。
問題:
在這個例子中,使用await Task.WhenAll
的好處恰恰是系統不需要花費資源去創建一個新的“軟件線程”? 我的想法對嗎?
例子:
int Tasks = Environment.ProcessorCount * 2;
int Count = 0;
List<Task> MyListForTask = new List<Task>();
void MyMethod()
{
lock (MyListForTask)
{
Count++;
}
Console.WriteLine(Count);
int Sum = int.MaxValue;
while (Sum > 0)
{
Sum--;
}
}
//Option 1: Task.WaitAll. For a machine with 16 threads: 16 + 16 runs
for (int i = 0; i < Tasks; i++)
{
MyListForTask.Add(new Task(MyMethod));
MyListForTask[i].Start();
}
Console.WriteLine("Method Main works");
Task.WaitAll(MyListForTask.ToArray());
Console.WriteLine("\n");
MyListForTask.Clear();
Count = 0;
//Option 2: await Task.WhenAll. For a machine with 16 threads: 16 + 16 runs
for (int i = 0; i < Tasks; i++)
{
MyListForTask.Add(new Task(MyMethod));
MyListForTask[i].Start();
}
Console.WriteLine("Method Main works");
await Task.WhenAll(MyListForTask.ToArray());
Task.WaitAll
阻塞調用線程,直到所有任務完成。
Task.WhenAll
創建一個在所有任務完成時完成的任務。
如果您等待或等待Task.WhenAll
返回的任務,效果類似。
在任何情況下,調用線程都不會運行所有任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.