直接指定Action和用TPL数据流ActionBlock指定Task Generator有什么区别



直接指定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会为每个项目的执行占用一个额外的线程,只是在执行完成后将其释放回线程池。它正在毫无理由地将工作卸载到另一个线程。所以不要使用它,它不会增加任何价值。

相关内容

最新更新