C# 如何使用线程池赢得';不要因为创建自己的线程而使主机资源崩溃?
对于选择使用线程池而不是创建自己的线程,我仍然有点困惑 我知道在创建自己的线程时会出现性能问题(为我创建的每个线程创建、执行垃圾收集器收集),所以不必再提这个问题C# 如何使用线程池赢得';不要因为创建自己的线程而使主机资源崩溃?,c#,.net,multithreading,threadpool,C#,.net,Multithreading,Threadpool,对于选择使用线程池而不是创建自己的线程,我仍然有点困惑 我知道在创建自己的线程时会出现性能问题(为我创建的每个线程创建、执行垃圾收集器收集),所以不必再提这个问题 关键是,如果我使用线程池提取创建的线程数,(我不定义线程限制),CLR如何知道有多少线程足够呢?运行时有预定义数量的工作线程运行,我认为默认值是10。它会将您要完成的工作请求排队,直到池中有一个未占用的线程。这是一个非常简单且相当安全的多线程模型,但您可能需要研究“async/await”,因为它可以利用多个并发模型并抽象出其丑陋之处
关键是,如果我使用线程池提取创建的线程数,(我不定义线程限制),CLR如何知道有多少线程足够呢?运行时有预定义数量的工作线程运行,我认为默认值是10。它会将您要完成的工作请求排队,直到池中有一个未占用的线程。这是一个非常简单且相当安全的多线程模型,但您可能需要研究“async/await”,因为它可以利用多个并发模型并抽象出其丑陋之处。基于内核数量和其他因素,.NET运行时会自动选择合理的最大线程数,但是如果你有特殊需要,你可以自己设置这个数字
如果系统耗尽资源,线程池不会崩溃。线程池将等待下一个线程运行您的请求(无论它是什么)
但是,请注意,可能耗尽最大可用线程数SIS 99.5%的代码写得不好或不正确。请查看
QueueUserWorkItem
。这里的关键字是“队列”
将方法排队以执行。该方法在线程池线程变得可用时执行
ThreadPool提供了一个线程池,可用于执行任务、发布工作项、处理异步I/O、代表其他线程等待以及处理计时器
ie:
ThreadPool.QueueUserWorkItem((i)=>Console.WriteLine(“你好”)代码>所以我几乎完全抽象了创建的线程数量?是的。。。。。。。。。。。。。但问题是它到底会不会崩溃。答案是——它不会。。。