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