直接指定Action
或使用.NET TPL数据流Func<Task>
指定ActionBlock
有什么区别?
直接行动:
new ActionBlock<Message[]>(x => DoSomething(x))
任务:
new ActionBlock<Message[]>(x => Task.Run(() => DoSomething(x)))
我正在尝试理解并行执行方面的差异(MaxDegreeOfParallelism
&gt; 1)。
答案 0 :(得分:5)
TPL Dataflow支持async
和同步代理,因此并行度没有区别。它知道&#34;到await
返回的任务,表示项目的异步执行,而不是继续到下一个项目。在这两种情况下,将同时处理不超过MaxDegreeOfParallelism
个项目。第一个选项将使用同步委托(即Action
),而第二个选项将使用async
一个(即Func<Task>
)。
然而,使用Task.Run
将为每个项目的执行占用一个额外的线程,只有在完成后才将其释放回线程池。它没有任何理由将工作卸载到另一个线程。所以不要使用它,它没有任何价值。