在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往后那样慢了呢?高手们解答,小弟感激涕零..
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往后那样慢了呢?高手们解答,小弟感激涕零..
解决方案 »
- TreeView 数据库
- 一段代码里的运算符看不懂。求解释。
- C# 显示图片的void数据接口有么?
- 救助!!
- 关于窗体间值传递的问题。
- 关于页面闪烁的问题
- 如何把查询的结果输出或者是做报表
- webform(C#)中ListItem class在winform中如何寫?
- C# RichTextBox 一个简单而又复杂的【复制粘贴】问题
- 先给大家拜个早年,关于 windows api的问题(在线等待)
- ***********小姑娘提个问题,希望大哥哥给予回答:在Visual C#中,如何知道已经编写的程序有多少行*************
- 菜鸟问题:鼠标每点击一下菜单,就出来一个重复窗体,请问怎样设定只弹出一个啊?
第一个
lock(this)
{
label8.Text=currentMail.ToString();
if(currentMail>=totalMail)break;
_currentMail=currentMail++;
}
很快执行完了,解锁后线程2也很快执行完了这个,依次很快都执行完了这些,所以很快到了100,但是下面的
MailSender mailS=new MailSender();
mailS.StartSendMail(_currentMail);
很慢,所以线程1一直要等到它执行完了,才进行下一次,其他的类似。
MailSender mailS=new MailSender();
mailS.StartSendMail(_currentMail);时,都会各自创建一个实例去执行StartSendmail(..)方法,为什么好像只有一个线程在执行那么慢哪?不解
谢谢帮忙