none
关于asp.net中的线程池问题 RRS feed

  • 问题

  • 最近学习多线程 ,也大概了解了线程池的作用。在测试asp.net对aspx或者ashx访问的时候,遇到了一些问题。先来陈述一些我对线程池的理解,然后在提出问题,否则说不明白。

    1.我最初理解线程池是在ConsoleApplication中测试慢慢理解的,至于线程池的好处这里就不说了。先看一段代码

    static void Main(string[] args)
    {
            ThreadPool.SetMinThreads(100, 100);
            for (int i = 0; i < 50; i++) {
                ThreadPool.QueueUserWorkItem(new WaitCallback(CallBack), null);
            }
            Console.ReadLine();
    }
    
    static void CallBack(object o)
    {
            Thread.Sleep(5000);
            //输出GetAvailableThreads中一些数据来观察
     }

    这个程序很简单 就是先设置线程池最小线程为100,然后循环50次来测试并发线程  每个线程中的处理都睡眠5秒,由于提前设置了线程池最小线程是100, 所以程序结果所花费的时间差不多也是5秒左右。假如不设置最小线程数系统默认是1,再运行的话就会慢很多,因为在不断在线程池中创建新的线程,基本上每秒2个。以上是我对线程池的理解。

    2.好了,我感觉基本上了解线程池了,所以我就开始测试Asp.net Web程序了。

    先在Global.asax中的Application_Start时间中添加ThreadPool.SetMinThreads(100, 100);设置线程池最小线程数为100.

    测试Handler.ashx(是IHttpHandler,不是异步Handler,还有据我了解访问一次asp.net的CLR线程池其实就开始启动一个线程了,所以无需自己启动线程)

    public void ProcessRequest(HttpContext context)
    {
    	Thread.Sleep(5000);
    }

    ok,在测试之前我认为结果应该是和ConsoleApplication中的测试时间是一样的是5秒左右,然后我用测试工具同时发起50个线程访问Handler.ashx,结果是18秒!然后再同时发起50个线程访问结果是15秒,再测试就一直处于15秒趋于稳定了。

    这里就是我的疑问了,为什么第一次时间比较长(申明下并不是程序加载的所花的时间,我是先运行一个网页后完成加载后才测试的),明明设置了最小线程数100了,为什么不是5秒呢? 然后我在Handler.ashx中加入了Debug,发现线程不是一下子起来的(ConsoleApplication就是一下瞬间起来50个线程,因为设置了最小线程数),而是有间隔的一个一个起来的,我也查看了线程池最大线程数是200,并不是线程池满了,就感觉那个间隔像在创建新的线程,因为debug中GetAvailableThreads取到的worker数也是一个一个慢慢消减下去,而且为什么第二次时间减少的原因很可能是之前第一次在线程池里已经创建了50个工作线程了,所以第二次直接调用时间就少了,所以得出结论ThreadPool.SetMinThreads(100, 100);这个方法没有用??问题是可是我继续在ashx中debug,输出GetMinThreads的确是100呀??

    哎,这个问题困惑我好久了,大家帮帮我啊。哪里理解做了啊


    2012年4月25日 1:39

答案

全部回复

  • 大牛们快快现身...如果可以的话最好能用GMail即时聊天或者msn也行  现在脑子里好多疑问呢  惆怅中 

    快乐地编程到老

    2012年4月26日 1:34
  • 你好,

    请参考下这篇KB: http://support.microsoft.com/kb/976898 ,这个问题应该是个已知的问题。


    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com
    Microsoft One Code Framework

    2012年4月26日 6:13
    版主
  • 原来是这样的啊   再想问一下  是不是只有3.5的时候才会有这样的情况?2.0,3.0.4.0 其他版本会有这样的问题吗

    解决方案貌似要装补丁  并发大量假如1w条  如果不装补丁  岂不是慢死了。。  


    快乐地编程到老

    2012年4月26日 6:33
  • 你好,

    你需要测试下的。


    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com
    Microsoft One Code Framework

    2012年4月26日 6:35
    版主
  • 在vs2010上运行  测试了2.0,3.0,3.5  都是以上的情况 一开始线程池中的线程都是一个一个起来的

    测试4.0 有点不一样 (这里测试并发50次访问) 并不是瞬间起来50次    而是先瞬间起来27个左右(我认为应该是30个 还有2,3个运行线程是其他的)  起来27个以后又停住了   感觉在等待 貌似感觉线程池满了   我访问的ashx里睡眠5秒   好像瞬间起来27个以后也停了5秒  之后又瞬间条到42个 又停住5秒  最后完成50次

    后来我又换睡眠10秒   果然也是这样  到27个后停了10秒  之后一样   我同时输出GetAvailableThreads和GetMaxThreads信息   奇怪的是停住的那一刻线程池并没有满, 27个的时候还有70来个工作线程没有用呢 最大线程也是100个   反正看的我晕乎乎的


    快乐地编程到老

    2012年4月26日 7:43