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

Ale*_*lex 2 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

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

我想念什么?

Mar*_*ell 12

Task表示“需要做的事情,可能已经完成,可能正在并行线程上执行,或者取决于进程外数据(套接字等),或者可能只是连接到了交换机”的地方,说“做了”” -它有非常小的螺纹加工做,除了:如果您计划延续(又名await),然后以某种方式,将需要回到上一个线程来火,但是具体如何发生,是什么手段取决于所创建并拥有任务的任何代码。

注意:并行性可以用多个任务来表示(如果您愿意的话),但是多个任务并不意味着并行性。

在您的情况下:一切取决于是什么CanRun-是什么- 我们不知道。它也应该被称为CanRunAsync