我应该使用async或Task来处理大量并发操作吗?

Ste*_*eve 1 c# task-parallel-library async-await tpl-dataflow

我正在编写一个Windows服务,它将处理大量输入文件.

我的问题是我是否应该使用asyncawait,或者我是否应该使用可以创建自定义库来Task限制并发线程的数量.

我知道一个事实,如果我排队200个线程,完成所有事情需要更长的时间,而不是一次运行10个(各种资源争夺,CPU中的上下文切换等)

所以我的问题是这些新一届特征是否asyncawait任何更多的运行时的弹性,或者我应该只写我自己的定制库?

Ste*_*ary 6

如果您正在进行基于I/O的操作,async并且await非常棒.在Win32服务中,您没有SynchronizationContext,因此所有延续都以线程池上的任务结束,这样可以很好地实现负载平衡.(记住,Task!= Thread;数百甚至数千个Tasks就好了).

如果您正在进行基于CPU的操作,那么我建议使用任务并行库.特别是Parallel类型.PLINQ有时更容易使用,但它会假设它可以默认使用所有内核; 因为你正在做一个Win32服务,你想要有点"更好"(使用Linux术语).

TPL Dataflow是一个很棒的库,可以提升async/ await进入下一个级别.听起来您的解决方案可能使用基于TPL数据流的方法.你也可以async很好地在TPL和TPL Dataflow 之间"混合搭配" .