并行使用任务

时间:2017-05-21 06:49:33

标签: c# asynchronous task

我目前正在创建一个引擎,它将启动10个新线程,这将完成不同的工作。但我发现我的解决方案不能并行运行。

public async Task Start(Func<string, Task> action)
{
   for (var i = 1; i <= config.threads; i++)
    {
        consumers.Add(getActionTask(action));
    }

    await Task.WhenAll(consumers);
}

private Task getActionTask(Func<string, Task> action)
{
    return Task.Run(async () =>
    {
        // Do something that returns a string
        String data = "Some string here";
        await action(data);
    }
}

让我说我运行2个线程,并根据数据将第一个线程执行Task.Delay(TimeSpan.FromSeconds(30)); 第二个线程将在循环中打印“Hello”。

在延迟结束之前永远不会得到打印循环,我的实现有什么问题?

1 个答案:

答案 0 :(得分:0)

Task.WhenAll并未表示任务将并行运行。它会创建一个Task,一旦您作为WhenAll方法的参数传递的所有任务都完成,它就会完成。

如果您希望代码并行运行,则应使用ParallelForEach方法。

<强>更新

斯科特在评论中指出的一个重要注意事项是Parallel类中的函数不适用于异步方法。如果要使用异步方法,则必须使用TPL Dataflow