当前位置: 代码迷 >> C# >> backgroundworker的小bug?解决方案
  详细解决方案

backgroundworker的小bug?解决方案

热度:150   发布时间:2016-05-05 02:56:37.0
backgroundworker的小bug?
    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 能处理过来就不会假死,但是这么解决是不合理的,合理的方案我在那个帖子里说了。
  相关解决方案