问题一:应用线程池,程序中不断起线程,线程数涨到1000+,导致最终OutOfMemory。调用SetofMaxThreads可以解决问题,但是不知道该设置多少线程数。该如何设置最大线程数。
问题二:如何保证线程合理的开启,线程调度是怎样的。
问题三:System.Threading.Tasks.Task 可以自适应控制线程的开启吗。该如何实现
------解决思路----------------------
在 32 位 windows 操作系统中,你自己的线程池大小设置成 200 就行了。在 64位系统下,设置为10000 也就可以了。不过 OutOfMemory 具体是什么造成的,从你的描述中,还是根本不得而知的。
线程池是一个队列,比如说你同时注册500个任务,但是当前只有180个可被立即执行,那么自然有320个任务在等待线程池有空闲的线程。
在使用线程时,要防止因为线程池有自动的队列就长时间占用线程的问题。一个好的程序,可能向线程池中注册1000个任务,而线程池的大小最多只有20个,如果人家的任务并不长时间占用线程,也非常快地看起来非常像是“并行”地完成。
如果你们的程序一直占用着线程在哪里“循环、阻塞”,那么纠结什么 Task 之类的肯定于事无补。一点封装过的技术名词儿并不能解决应用设计问题。
另外你所说的 OutofMemory 异常,既然你不能贴出你们自己的代码来调试,那么就应该自己多考虑其它代码的因素,不要什么问题都推在“线程太多”上。滥用线程自然是一个问题,但是不一定你现在就真的找到了自己该找的问题。
------解决思路----------------------
线程数不断的增长,检查一下线程函数里是否使用了死循环吧
很明显你的线程只是不断开启,根本不会结束
即使改用线程池,也并不解决任何问题