1

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

我的问题是我是否应该使用asyncand await,或者我是否应该使用它来创建一个自定义库Task,这可能会限制并发线程的数量。

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

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

4

1 回答 1

6

如果您正在执行基于 I/O 的操作,那就async太好await了。在 Win32 服务中,您没有SynchronizationContext,因此您的所有延续最终都作为线程池上的任务,这在负载平衡方面做得很好。(请记住,Task!= Thread;数百甚至数千个Tasks 都可以)。

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

TPL Dataflow 是一个很棒的库,可以将async/await提升到一个新的水平。听起来您的解决方案确实可以使用基于 TPL 数据流的方法。您还可以async很好地在 、TPL 和 TPL 数据流之间“混合和匹配”。

于 2013-05-15T18:06:35.607 回答