首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

为啥使用了BackgroundWorker,窗体还是处于假死状态,赐教

2012-12-15 
为什么使用了BackgroundWorker,窗体还是处于假死状态,赐教 private void MyBackWorker_ProgressChanged(ob

为什么使用了BackgroundWorker,窗体还是处于假死状态,赐教
 private void MyBackWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                this.MyBar.Value = e.ProgressPercentage;
                this.labMessage.Text = e.UserState.ToString();
                this.labMessage.Update();
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }

        private void MyBackWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //线程处理完成时
            try
            {
                MessageBox.Show("完成!");
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }

        private void MyBackWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //开始执行后台程序
            try
            {   
                this.work(MyBackWorker,e);
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }

        private void work(BackgroundWorker bk,DoWorkEventArgs e)
        {
            int Nums = 1000000;
            for (int i = 1; i < Nums; i++)


            {
                if (bk.CancellationPending) 
                {
                    bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
                    e.Cancel = true;
                    break;
                }
                bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
            }
         }

        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                this.MyBackWorker.RunWorkerAsync();
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            try
            {
                this.MyBackWorker.CancelAsync();
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }
[最优解释]
问题在于循环体执行太快了,ReportProgress后,界面来不及处理,看起来是假死。

定义一个全局变量,tempTime = DateTime.Now;
然后把下面的代码加到For体的最上面,你就能看到效果。
if (DateTime.Now.Subtract(tempTime).Ticks == 0)
    continue;
else
    tempTime = DateTime.Now;


[其他解释]
循环太快了,可以没循环500次 执行一次 MyBackWorker_ProgressChanged
[其他解释]
每十次循环,Sleep(10)试试
------其他解决方案--------------------



        private void button2_Click(object sender, EventArgs e)
        {
            BackgroundWorker wb = new BackgroundWorker();
            wb.DoWork += wb_DoWork;
            wb.WorkerReportsProgress = true;
            wb.ProgressChanged += wb_ProgressChanged;
            wb.RunWorkerCompleted += wb_RunWorkerCompleted;
            wb.RunWorkerAsync();
        }

        void wb_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.button2.Text = "OK";
        }

        void wb_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

        void wb_DoWork(object sender, DoWorkEventArgs e)
        {
            int i = 0;
            while (i < 100)
            {
                ((BackgroundWorker)sender).ReportProgress(i);
                i++;
                Thread.Sleep(300);
            }
        }

给个简单例子给你看。
[其他解释]
帮顶了,我是不会啊!
[其他解释]
引用:
问题在于循环体执行太快了,ReportProgress后,界面来不及处理,看起来是假死。

定义一个全局变量,tempTime = DateTime.Now;
然后把下面的代码加到For体的最上面,你就能看到效果。
if (DateTime.Now.Subtract(tempTime).Ticks == 0)
    continue;
else
    tempTime = Dat……


非常感谢几位兄弟,搞定!

热点排行