为什么使用了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);
}
}
给个简单例子给你看。
[其他解释]
帮顶了,我是不会啊!
[其他解释]
非常感谢几位兄弟,搞定!