在c#中,创建100个线程,Start后执行函数StartSendMail(),如下:
int totalMail=100000;
int currentMail=0;private void StartSendMail()
{
   while(true)
   {
int _currentMail=0;//每个线程只操作属于自己的临时变量
开始锁定
lock(this)
{
label8.Text=currentMail.ToString();
if(currentMail>=totalMail)break;
_currentMail=currentMail++;
}
//释放锁定
        MailSender mailS=new MailSender();
        mailS.StartSendMail(_currentMail);
 
    }
}
小弟的理解是这样的,所创建的100个线程,都会执行过程StartSendMail(),这里,为了避免共享变量的冲突,我采用定义临时变量_currentMail的方法,但问题是,当程序启动后,我发现label8显示的信息很快长到了100,那也就是说100个线程很快就执行了一次,但是接下来每个线程还要继续while循环的,为什么label8显示的数字递增速度突然变慢了?慢得好像单线程在工作一样,我已经创建100个线程了啊,为什么currentMail从1到100的时候那么快,从100往后那样慢了呢?高手们解答,小弟感激涕零..

解决方案 »

  1.   

    因为是多线程,所以
    第一个
    lock(this)
    {
    label8.Text=currentMail.ToString();
    if(currentMail>=totalMail)break;
    _currentMail=currentMail++;
    }
    很快执行完了,解锁后线程2也很快执行完了这个,依次很快都执行完了这些,所以很快到了100,但是下面的
     MailSender mailS=new MailSender();
            mailS.StartSendMail(_currentMail);
    很慢,所以线程1一直要等到它执行完了,才进行下一次,其他的类似。
      

  2.   

    按理说,每个线程执行到
    MailSender mailS=new MailSender();
            mailS.StartSendMail(_currentMail);时,都会各自创建一个实例去执行StartSendmail(..)方法,为什么好像只有一个线程在执行那么慢哪?不解
    谢谢帮忙
      

  3.   

    这与你的网络条件或是CPU的运行速度有关,看看这个程序运行时的网络状况和CPU利用率。因为你是单CPU在做这件事所以其实和单线程发送在时间上应该没有什么区别。。btw,你试一下将线程数减少到50,估计到50就慢下来了。