Task.WhenAll是否在后台线程并行运行任务

时间:2015-11-24 10:49:00

标签: c# async-await task

以下两个代码片段是否相同?

//--------------------------------------------------
1.
//--------------------------------------------------

var producer = Task.Run(async () =>
{
    await bar.ReadDataAsync();
});

var consumer = Task.Run(async () =>
{
    await bar.WriteDataAsync();
});


await Task.WhenAll(consumer, producer);

//--------------------------------------------------
2.
//--------------------------------------------------

await Task.WhenAll(bar.ReadDataAsync(), bar.WriteDataAsync());

2 个答案:

答案 0 :(得分:5)

Task.WhenAll不会运行任务。此方法无法启动任务。

Task.WhenAll 做的事情是返回一个新的Task,只有当所有原始任务完成时才会完成

来自msdn

  

Task.WhenAll Method

     

.NET Framework 4.6和4.5

     

创建一个任务,该任务将在所有提供的任务完成时完成   完成。

     

https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall%28v=vs.110%29.aspx

在您的示例中,您调用了Task.Run。这是一个您希望异步运行工作单元的请求。但是,不保证线程亲和性。这两个工作单元可以同步运行 - 这取决于默认的TaskScheduler来决定。

答案 1 :(得分:-4)

Task.WhenAll中没有魔法 - 它是一种与其他方法一样的方法。

因此,首先评估它的所有参数,然后才执行方法本身。所以,是的,你得并行执行。