直接指定Action或使用TPL数据流ActionBlock指定Task-Generator有什么区别?

时间:2014-10-09 09:30:10

标签: c# .net task-parallel-library async-await tpl-dataflow

直接指定Action或使用.NET TPL数据流Func<Task>指定ActionBlock有什么区别?

直接行动:

new ActionBlock<Message[]>(x => DoSomething(x))

任务:

new ActionBlock<Message[]>(x => Task.Run(() => DoSomething(x)))

我正在尝试理解并行执行方面的差异(MaxDegreeOfParallelism&gt; 1)。

1 个答案:

答案 0 :(得分:5)

TPL Dataflow支持async和同步代理,因此并行度没有区别。它知道&#34;到await返回的任务,表示项目的异步执行,而不是继续到下一个项目。在这两种情况下,将同时处理不超过MaxDegreeOfParallelism个项目。第一个选项将使用同步委托(即Action),而第二个选项将使用async一个(即Func<Task>)。

然而,使用Task.Run将为每个项目的执行占用一个额外的线程,只有在完成后才将其释放回线程池。它没有任何理由将工作卸载到另一个线程。所以不要使用它,它没有任何价值。