C# BG工人的进度问题
当执行以下代码时,进度条不会一直到最后,当进度条完成90%时,将显示消息框。我发现for循环存在问题,但不知道真正的问题是什么。请帮忙。我也在stackoverflow搜索了同样的问题。但没有找到任何解决办法 这是我的代码:C# BG工人的进度问题,c#,progress-bar,backgroundworker,C#,Progress Bar,Backgroundworker,当执行以下代码时,进度条不会一直到最后,当进度条完成90%时,将显示消息框。我发现for循环存在问题,但不知道真正的问题是什么。请帮忙。我也在stackoverflow搜索了同样的问题。但没有找到任何解决办法 这是我的代码: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { if
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
break;
}
backgroundWorker1.ReportProgress(i);
Thread.Sleep(100);
}
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Cancelled");
progressBar1.Value = 0;
}
else
{
progressBar1.Value = 0;
MessageBox.Show("Done");
}
}
private void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i<100;i++)
{
if(backgroundWorker1.CancellationPending)
{
e、 取消=真;
打破
}
背景工作1.报告进度(一);
睡眠(100);
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
backgroundWorker1.RunWorkerAsync();
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
backgroundWorker1.CancelAsync();
}
私有void backgroundWorker1\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
progressBar1.值=e.ProgressPercentage;
}
私有void backgroundWorker1\u RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
如果(如已取消)
{
MessageBox.Show(“取消”);
progressBar1.值=0;
}
其他的
{
progressBar1.值=0;
MessageBox.Show(“完成”);
}
}
更改后台工作1.报告进度(i)代码>
致:
或将循环更改为:
for (int i = 1; i <= 100; i++)
for(int i=1;i我重现了您的问题。问题在于DoWork方法太快,进度条的重新绘制无法跟上。如果您尝试更改该线程。睡眠时间间隔更大(我尝试了300毫秒),您可以看到完整的绘制
但是,如果在progressbar.Value设置为零之前移动MessageBox.Show(“完成”),则可以帮助进度条重新绘制
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Cancelled");
progressBar1.Value = 0;
}
else
{
MessageBox.Show("Done");
progressBar1.Value = 0;
}
}
您是否检查了progressbar的最大属性是否为100?是否有纠正该pal的解决方案?在设置progressbar.Value=0;
之前移动MessageBox.Show(“Done”)
,可能会有很大帮助…:-)您也尝试过,但结果相同。问题可能是进度条如你所说的重新绘制。你是对的,朋友。上一次迭代没有考虑在内。因此,如您所说更改循环值是正确的。但是,即使我们改变了它,进度条也比我们预期的要慢一些,正如@Steve(上图)所说。
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Cancelled");
progressBar1.Value = 0;
}
else
{
MessageBox.Show("Done");
progressBar1.Value = 0;
}
}