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