为什么List <task>并不总是并行运行?

时间:2019-03-13 14:03:04

标签: c# .net parallel-processing

当我需要一些并行处理时,通常会这样:

static void Main(string[] args)
{
    var tasks = new List<Task>();
    var toProcess = new List<string>{"dog", "cat", "whale", "etc"};
    toProcess.ForEach(s => tasks.Add(CanRunAsync(s)));
    Task.WaitAll(tasks.ToArray());
}

private static async Task CanRunAsync(string item)
{
    // simulate some work
    await Task.Delay(10000);
}

在有些情况下,它不能并行处理项目,而不得不使用Task.Run来强制它在不同的线程上运行。

我想念什么?

1 个答案:

答案 0 :(得分:12)

Task表示“需要做的事情,可能已经完成,可能正在并行线程上执行,或者取决于进程外数据(套接字等),或者可能只是... ...连接到说“完成”的交换机” –它与线程几乎没有什么关系,除了:如果您安排 continuation (又名{ {1}},然后以某种方式,这将需要回到线程上进行触发,但是这种情况如何发生以及其含义取决于所创建并拥有任务的任何代码。

注意:并行性可以表示为多个任务(如果您选择的话),但是多个任务并不表示并行性。

以您的情况为例:这完全取决于await的作用或作用-而我们不知道。也应该将其称为CanRun