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

stb*_*stb 2 .net c# task-parallel-library async-await tpl-dataflow

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

直接行动:

new ActionBlock<Message[]>(x => DoSomething(x))
Run Code Online (Sandbox Code Playgroud)

任务:

new ActionBlock<Message[]>(x => Task.Run(() => DoSomething(x)))
Run Code Online (Sandbox Code Playgroud)

我试图了解并行执行方面的差异(MaxDegreeOfParallelism> 1).

i3a*_*non 5

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

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