backgroundworker问题

faoyy 2011-11-08 10:50:13
我想实现在界面上实时更新一个label的值,用for循环100000此,用的backgroundworker方法和线程+委托的两种方法:

//BackgroundWorker
DateTime now;
TimeSpan ts;
private void button3_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy)
return;
now = DateTime.Now;
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
for (int i = 0; i < 100000; i++)
{
bw.ReportProgress(i,100000);
Thread.Sleep(1); }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label3.Text = e.ProgressPercentage.ToString();
progressBar3.Value = e.ProgressPercentage / 1000;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar3.Value = 100;
ts = DateTime.Now - now;
MessageBox.Show("BackgroundWorker:"+ts.TotalMilliseconds);
}
//線程+委託
private void button2_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(ShowNum));
th.Start();
}
public delegate void UpdateText(int i);

public void UpdateTextLabel(int i)
{
if (label2.InvokeRequired)
{
UpdateText ut = new UpdateText(UpdateTextLabel);
label2.Invoke(ut, i);
}
else
{
label2.Text = i.ToString();
progressBar2.Value = i / 1000;
}
}

public void ShowNum()
{
DateTime now = DateTime.Now;
for(int i =0;i< 100000;i++)
{
UpdateTextLabel(i);
}
DateTime now1 = DateTime.Now;
TimeSpan ts = now1 - now;
MessageBox.Show("線程+委託:" + ts.TotalMilliseconds);
}


我想问得时为什么在backgroundworker中用加入sleep,最初我没加,结果label没有实时更新,加了以后达到效果,但是速度变慢了,而线程+委托方法,速度快,但是cpu占用率却很高,谁能帮我解答一下这些问题
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
faoyy 2011-11-09
  • 打赏
  • 举报
回复
我就是想弄个小程序然后搞懂多线程,并不是只要结果,但还是谢谢你回答
卧_槽 2011-11-09
  • 打赏
  • 举报
回复
建议直接用timer
faoyy 2011-11-09
  • 打赏
  • 举报
回复
来人帮帮忙呀

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧