我在界面上第一了一个BackgroundWorker组件
 现在
        private void gisBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            gisBackgroundWorker.ReportProgress(10, "110");
            gisBackgroundWorker.ReportProgress(20, "111");
            gisBackgroundWorker.ReportProgress(100, "112");
        }
        private void gisBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MessageBox.Show(e.UserState.ToString());
        }        private void gisBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("完成");
        }
 调用的时候 为什么事先弹出“完成”
 再弹出“112” “111”,“110”
 按照介绍的不是应该gisBackgroundWorker.ReportProgress(10, "110");
 触发事件 private void gisBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)么?
 这个时候先MessageBox.Show(e.UserState.ToString()); 弹出“110”么?
不懂 为什么会这样
能分析一下么?

解决方案 »

  1.   

    参考:http://blog.csdn.net/zhoufoxcn/archive/2007/10/19/1832819.aspx
      

  2.   

    但是很奇怪
            private void gisBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressBar1.Value = e.ProgressPercentage;
            }
     如果这么写就没问题了
     
    我想可能MessageBox.Show(e.UserState.ToString())阻塞了界面线程
     引发的问题
      

  3.   

    DoWork 调用 RunWorkerAsync 时发生
    ProgressChanged 调用 ReportProgress 时发生
    RunWorkerCompleted 当后台操作已完成、被取消或引发异常时发生
    DoWork事件是在后台线程中运行的,在该事件中不能够操作用户界面的内容,如果需要更新用户界面,可以使用ProgressChanged事件及RunWorkCompleted事件来实现