我在C#中有一个应用程序,上面有一个要做的工作列表。我希望尽可能多地并行完成这项工作。但是,我需要能够控制并行任务的最大数量。
据我所知,这可以通过ThreadPool或Tasks来实现。我用哪一个有区别吗?我主要关心的是能够控制一次有多少个线程处于活动状态。
发布于 2011-11-10 05:16:01
请查看Task%s的ParallelOptions.MaxDegreeOfParallelism。
我建议您使用任务,因为它们提供了比ThreadPool更高级别的抽象。
关于这个主题的很好的读物可以在here上找到。真的,这是一本必备的书,而且还是免费的:)
发布于 2011-11-10 05:25:10
在第三方物流中,您可以在ParallelEnumerable或ParallelOptions.MaxDegreeOfParallism上使用WithDegreeOfParallelism
如果您只使用自定义线程或任务,CountdownEvent可能是一个更好的选择。
在ThreadPool中,当您使用SetMaxThreads时,它对AppDomain是全局的,因此您可能会不必要地限制不相关的代码。
您不能将工作线程数或I/O完成线程数设置为小于计算机中处理器数的数。
如果公共语言运行库由Internet信息服务(IIS)或SQL Server承载,则宿主可以限制或阻止对线程池大小的更改。
更改线程池中的最大线程数时要小心。虽然您的代码可能会受益,但这些更改可能会对您使用的代码库产生不利影响。
将线程池大小设置得太大可能会导致性能问题。如果同时执行的线程太多,任务切换开销将成为一个重要因素。
我同意另一个答案,即你应该在ThreadPool上使用第三方编程,因为它是多线程的更好的抽象,但在两者中都有可能实现你想要的。
发布于 2011-11-10 05:17:08
在这篇article on msdn中,他们解释了为什么推荐使用Tasks而不是ThreadPool来实现并行性。
https://stackoverflow.com/questions/8071709
复制相似问题