Ste*_*eve 1 c# task-parallel-library async-await tpl-dataflow
我正在编写一个Windows服务,它将处理大量输入文件.
我的问题是我是否应该使用async和await,或者我是否应该使用可以创建自定义库来Task限制并发线程的数量.
我知道一个事实,如果我排队200个线程,完成所有事情需要更长的时间,而不是一次运行10个(各种资源争夺,CPU中的上下文切换等)
所以我的问题是这些新一届特征是否async和await任何更多的运行时的弹性,或者我应该只写我自己的定制库?
如果您正在进行基于I/O的操作,async并且await非常棒.在Win32服务中,您没有SynchronizationContext,因此所有延续都以线程池上的任务结束,这样可以很好地实现负载平衡.(记住,Task!= Thread;数百甚至数千个Tasks就好了).
如果您正在进行基于CPU的操作,那么我建议使用任务并行库.特别是Parallel类型.PLINQ有时更容易使用,但它会假设它可以默认使用所有内核; 因为你正在做一个Win32服务,你想要有点"更好"(使用Linux术语).
TPL Dataflow是一个很棒的库,可以提升async/ await进入下一个级别.听起来您的解决方案可能使用基于TPL数据流的方法.你也可以async很好地在TPL和TPL Dataflow 之间"混合搭配" .