任务与ThreadPool

pre*_*sto 9 c# parallel-processing multithreading task-parallel-library

我在C#中有一个应用程序列表.我希望尽可能多地同时完成这项工作.但是我需要能够控制并行任务的最大数量.

根据我的理解,这可以通过ThreadPool或任务来实现.我使用哪一个有区别吗?我主要担心的是能够一次控制多少个线程处于活动状态.

Vla*_*rov 20

请看看ParallelOptions.MaxDegreeOfParallelismTask秒.

我建议你使用Tasks,因为它们提供比ThreadPool更高级别的抽象.

可以在这里找到关于该主题的非常好的读物.真的,一本必备的书,它是免费的:)


Pau*_*yng 5

在TPL中,您可以使用WithDegreeOfParallelismon ParallelEnumerableParallelOptions.MaxDegreeOfParallism

CountdownEvent如果您只是使用自定义线程或任务,那么也可能是更好的选择.

ThreadPool,当你使用SetMaxThreads它的全局时,AppDomain你可能会不必要地限制不相关的代码.

您不能将工作线程数或I/O完成线程数设置为小于计算机中处理器数的数字.

如果托管公共语言运行库(例如,Internet信息服务(IIS)或SQL Server),则主机可以限制或阻止更改线程池大小.

更改线程池中的最大线程数时请小心.虽然您的代码可能会受益,但更改可能会对您使用的代码库产生负面影响.

将线程池大小设置得太大可能会导致性能问题.如果同时执行的线程太多,则任务切换开销成为一个重要因素.

我同意另一个答案,你应该使用TPL ThreadPool作为它更好的多线程抽象,但它可以在两者中实现你想要的.