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