我现在要给1W个用户发邮件,所以我就用线程的方式
如            for (Int32 i = 0; i <= 4000; i++)
            {
                //这里是启动多线程
                System.Threading.Thread NewTh = new System.Threading.Thread(new System.Threading.ThreadStart(SendMail));
                NewTh.SetApartmentState(System.Threading.ApartmentState.STA);
                NewTh.Start();
                while (NewTh.ThreadState == System.Threading.ThreadState.Running)
                {
                }
                System.Threading.Thread.Sleep(500);
            }但当发送了有3-4百个的时候IIS就挂了,
提示WebXXX.Service出错
然后网站就打不开了,我想是IIS挂掉了
大概是太多线程,无法处理出错那怎么来控件线程个个数呢如            for (Int32 i = 0; i <= 4000; i++)
            {
              if(线程<200)
              {
                //这里是启动多线程
                  System.Threading.Thread NewTh = new System.Threading.Thread(new System.Threading.ThreadStart(SendMail));
                NewTh.SetApartmentState(System.Threading.ApartmentState.STA);
                NewTh.Start();
                while (NewTh.ThreadState == System.Threading.ThreadState.Running)
                {
                }
                System.Threading.Thread.Sleep(500);
              }
            }那这里的
if(线程<200)
怎么写谢谢

解决方案 »

  1.   

    Web页面只做个队列,发送的事情写个服务或者WinForm来处理请求队列。
      

  2.   


    是用WinForm还是20线程*500这不重要
    我想了解
    ASP.NET建了多少线程后IIS就挂了,
    还有我如何判断我建立了多少个线程谢谢
      

  3.   

    这里你应该用线程池来处理。
    我以前的处理办法是使用一个QUEUE的队列,然后将邮件数据压到这个队列里面去,加一个TIMER定时检查这个队列的数量,如果说>0的话就将QUEUE中的邮件交由线程池来处理。
    这里需要控制这个队列的访问,确保同时只有一个线程在修改这个队列数据
      

  4.   


                    while (NewTh.ThreadState == System.Threading.ThreadState.Running)
                    {
                    }
    这句话就可以直接把你的CPU推到100%,因为NewTh只要还在发邮件,这里就相当于while (true),你有个while (true)在跑,人家NewTh还怎么发邮件?
      

  5.   

    我猜你原本的用意是把Sleep(500)放到while里面吧?不过这也不是最好的做法。我建议你做个队列,把邮件发送任务都放到队列里面,然后有一个专门的Thread在不停地处理队列,那就可以了。具体你可以看看Community Server的实现,它就是这样做的。而且还有心跳检测,如果负责处理邮件队列的线程死掉了,可以重启这个线程。
      

  6.   

    RE:我建议你做个队列,把邮件发送任务都放到队列里面,然后有一个专门的Thread在不停地处理队列
    ----------------------------
    如果是一个线程的话,我发邮件第一个要6秒一个,太慢了
    所以我想开100个线程来发谢谢