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

本文关键字:并行 运行 任务 线程 后台 WhenAll 是否 Task | 更新日期: 2023-09-27 18:24:08

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

//--------------------------------------------------
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());

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

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

Task.WhenAll所做的是返回一个新Task,该仅在所有原始任务完成后完成。

从 msdn

Task.WhenAll 方法

.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来决定。

Task.WhenAll中没有魔力 - 这是一种像其他方法一样的方法。

因此,首先计算其所有参数,然后才执行方法本身。所以是的,你可以并行执行。