2017-05-21 43 views
0

我目前正在创建一个引擎,它会旋转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

你可以用延迟和打印语句发布代码吗?顺便说一下,不要将'await action(data)'包装在对Task.Run的调用中,而不是必需的。 'getActionTask'方法应该返回'action(data);' –

回答

0

Task.WhenAll并没有说任务会并行运行。它会创建一个Task,一旦完成您作为参数WhenAll方法参数传递的所有任务,即可完成。

如果你想让你的代码并行运行,你应该使用ParallelForEach方法。

更新

一个斯科特指出,在下面他的评论是,在Parallel类的功能不与异步方法工作的重要笔记。如果您想使用异步方法,则必须使用TPL Dataflow

+2

需要注意的一件重要的事情是'Parallel'类中的函数不适用于异步方法。如果你想使用异步方法,你必须使用['TPL Dataflow'](https://msdn.microsoft.com/en-us/library/hh228603(v = vs.110).aspx)。 –

+0

@ScottChamberlain感谢您的注意!我将把它列入我的答案。 – Christos