对于选择使用线程池而不是创建自己的线程,我仍然有点困惑。
我知道创建自己的线程的性能问题(为我创建的每个线程创建、执行垃圾收集器收集),所以不需要提出这个问题
关键是,如果我使用线程池抽象创建线程的数量,(我没有定义线程限制),CLR如何知道多少就足够了?
对于选择使用线程池而不是创建自己的线程,我仍然有点困惑。
我知道创建自己的线程的性能问题(为我创建的每个线程创建、执行垃圾收集器收集),所以不需要提出这个问题
关键是,如果我使用线程池抽象创建线程的数量,(我没有定义线程限制),CLR如何知道多少就足够了?
运行时有预定义数量的工作线程运行,我认为默认值为 10。它会将您的工作请求排队,直到池中有一个未占用的线程。这是一个非常简单且相当安全的多线程模型,但您可能需要研究“异步/等待”,因为它可以利用多个并发模型并抽象出丑陋。
.NET 运行时会根据核心数和其他因素自动选择合理的最大线程数,但如果您有特殊需要,您可以自行设置此数字。
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
如果系统将耗尽资源,线程池不会崩溃。线程池将等到下一个线程可用于运行您的请求(无论它可能是什么)。
但是要注意一个可以耗尽最大可用线程的代码是 99.5% 是写得不好或不正确。
看看QueueUserWorkItem
。这里的关键字是'队列'。
排队执行的方法。该方法在线程池线程可用时执行。
ThreadPool 提供了一个线程池,可用于执行任务、发布工作项、处理异步 I/O、代表其他线程等待以及处理计时器。
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx
IE:ThreadPool.QueueUserWorkItem((i)=> Console.WriteLine("Hello"));