簡體   English   中英

Task.WaitAll vs await Task.WhenAll 和線程

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

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