使用TPL数据流ActionBlock时,直接指定操作或任务生成器有什么区别?

3
使用.NET TPL Dataflow的ActionBlock时,直接指定Action和使用Func<Task>有什么区别呢?

直接指定Action:

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

任务:

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

我想了解并发执行(MaxDegreeOfParallelism > 1)方面的区别。

1个回答

6
TPL Dataflow支持异步和同步委托,因此在并行度方面没有区别。它“知道”等待表示项目异步执行的返回任务而不继续下一个项目。在这两种情况下,最多只有MaxDegreeOfParallelism个项目会同时处理。第一种选择将使用同步委托(即Action),而第二个将使用async委托(即Func<Task>)。
然而,使用Task.Run将为每个项目的执行占用额外的线程,仅在完成后将其释放回线程池。它是无缘无故地将工作转移给另一个线程,所以不要使用它,它没有任何价值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接