解决方案 »

  1.   

    我觉得LZ还是说下你的需求好了..感觉你问的问题 是根据某"需求"来到..而且针对这个"需求"你问了<跑偏>的问题...而且 什么叫"调度" 你能解释下吗?
      

  2.   

    线程池是自定义的,实现了IDisposable接口,目的是用这个线程池写文件,文件结构就是一个个HTML,每个HTML最多30KB。因为是公司的代码不能贴出来。
      

  3.   


    在 32 位 windows 操作系统中,你自己的线程池大小设置成 200 就行了。在 64位系统下,设置为10000 也就可以了。不过 OutOfMemory 具体是什么造成的,从你的描述中,还是根本不得而知的。线程池是一个队列,比如说你同时注册500个任务,但是当前只有180个可被立即执行,那么自然有320个任务在等待线程池有空闲的线程。在使用线程时,要防止因为线程池有自动的队列就长时间占用线程的问题。一个好的程序,可能向线程池中注册1000个任务,而线程池的大小最多只有20个,如果人家的任务并不长时间占用线程,也非常快地看起来非常像是“并行”地完成。如果你们的程序一直占用着线程在哪里“循环、阻塞”,那么纠结什么 Task 之类的肯定于事无补。一点封装过的技术名词儿并不能解决应用设计问题。另外你所说的 OutofMemory 异常,既然你不能贴出你们自己的代码来调试,那么就应该自己多考虑其它代码的因素,不要什么问题都推在“线程太多”上。滥用线程自然是一个问题,但是不一定你现在就真的找到了自己该找的问题。
      

  4.   

    现在的问题是线程数不断增长,我通过控制最大线程数就是调用ThreadPool.SetMaxThreads可以控制住线程的增长,但是最大线程数的数量我不能做出合理的解释,不知道如何设置最大线程数。
      

  5.   

    一个好的程序,即使向“最大线程数只有20个”的线程池中同时注册1000个任务,如果人家的任务并不长时间占用线程,也非常快地执行完。如果你突然发现死锁了(但绝不应该是什么“OutOfMemory”),你不应该盲目地把20变为30,而是应该好好查一下自己的代码,看看有什么代码没有迅速释放所占用的线程。
      

  6.   

    调用ThreadPool.SetMaxThreads通过实验解决了OutOfMemory的问题,但是maxthreads数该在怎么确定不得而知。
      

  7.   


    我不懂什么叫做“控制住线程的增长”。线程池本来就是用来控制线程增长的,比如说设置为20,那么就是20。没听说过设置为20不能控制线程增长,而改为30反而能够控制线程的增长的。所以我看不懂你说的“控制线程的增长”是什么概念。你们的线程池很可能有严重的设计错误,但是你们的使用线程池的应用程序有设计错误的可能性更大。如果你们只是几个人拼凑个小项目,就别花时间去写什么“线程池”代码了,可以使用 .net 系统线程池。就算是只有几十行的代码,也不一定就能写好。
      

  8.   

    @7楼,没错我感觉它就是在不断的启线程,看任务管理器中threads的数量是增长很快的,我再认真看下代码。
    @Z65443344 ,@sp1234,@diaodiaop, 我是急于解决这个问题才出此下策使用了ThreadPool.SetMaxThreads使软件能够继续应用,知道根本问题没有找到。
      

  9.   

    @sp1234,使用线程池的应用程序确实也有问题,我在Debug找问题,因为不懂这个原理(小菜鸟一枚),一直也没有头绪。