Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BG工人的进度问题_C#_Progress Bar_Backgroundworker - Fatal编程技术网

C# BG工人的进度问题

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

当执行以下代码时,进度条不会一直到最后,当进度条完成90%时,将显示消息框。我发现for循环存在问题,但不知道真正的问题是什么。请帮忙。我也在stackoverflow搜索了同样的问题。但没有找到任何解决办法

这是我的代码:

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;                
    }
}