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

时间:2013-05-15 17:54:07

标签: c# task-parallel-library async-await tpl-dataflow

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

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

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

所以我的问题是这些新的功能asyncawait是否更具运行时弹性,或者我应该编写自己的自定义库?

1 个答案:

答案 0 :(得分:6)

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

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

TPL Dataflow是一个很棒的图书馆,它将async / await提升到了一个新的水平。听起来您的解决方案可能使用基于TPL数据流的方法。你也可以很好地在async,TPL和TPL Dataflow之间“混合搭配”。