Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用线程池赢得';不要因为创建自己的线程而使主机资源崩溃?_C#_.net_Multithreading_Threadpool - Fatal编程技术网

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(“你好”)

所以我几乎完全抽象了创建的线程数量?是的。。。。。。。。。。。。。但问题是它到底会不会崩溃。答案是——它不会。。。