我目前正在创建一个引擎,它将启动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”。
在延迟结束之前永远不会得到打印循环,我的实现有什么问题?
答案 0 :(得分:0)
Task.WhenAll
并未表示任务将并行运行。它会创建一个Task
,一旦您作为WhenAll
方法的参数传递的所有任务都完成,它就会完成。
如果您希望代码并行运行,则应使用Parallel
类ForEach
方法。
<强>更新强>
斯科特在评论中指出的一个重要注意事项是Parallel
类中的函数不适用于异步方法。如果要使用异步方法,则必须使用TPL Dataflow。