private void button2_Click(object sender, EventArgs e)
{
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 1000000; i++)
{
bgw.ReportProgress(30,i.ToString());
// Thread.Sleep(1000); //*****************注意这里*******************
}
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lbl.Text = e.UserState.ToString();
}
做了一个小测试,发现 Thread.Sleep(1000)不加的话,会导致UI的假死。这是个bug不?
------解决思路----------------------
这个不是BUG 是你程序的问题, 在UI线程中对控件进行循环操作时会出现界面等待的情况, 当你Sleep时才会有时间执行UI的刷新
你可以写在线程里循环 然后用委托去刷新界面
------解决思路----------------------
原因和这个一样:http://bbs.csdn.net/topics/391828274。这相当于对窗体的消息循环进行DoS攻击,短时间发起了大量 UI 更新请求,UI 处理的速度跟不上发起请求的速度,当然会假死。加了 Thread.Sleep 会降低发起请求的速度,UI 能处理过来就不会假死,但是这么解决是不合理的,合理的方案我在那个帖子里说了。