Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 为什么我的后台工作人员不为进度条工作_C#_.net_Winforms_Progress Bar_Backgroundworker - Fatal编程技术网

C# 为什么我的后台工作人员不为进度条工作

C# 为什么我的后台工作人员不为进度条工作,c#,.net,winforms,progress-bar,backgroundworker,C#,.net,Winforms,Progress Bar,Backgroundworker,为什么我的后台工作程序不适用于进度条(默认情况下,将可见性设置为false.) 我试图在背景中有一个进度条。当用户单击OK按钮时,我启动计时器并使进度条可见。 并运行backgroundWorker.RunWorkerAsync();在backgroundWorker_Runworker Completed中,我将进度条的可见性设置为false 问题是它只显示进度条,而不显示进度 我的代码在这里: private void btnOk_Click(object sender, E

为什么我的后台工作程序不适用于进度条(默认情况下,将可见性设置为false.)

我试图在背景中有一个进度条。当用户单击OK按钮时,我启动计时器并使进度条可见。 并运行backgroundWorker.RunWorkerAsync();在backgroundWorker_Runworker Completed中,我将进度条的可见性设置为false

问题是它只显示进度条,而不显示进度

我的代码在这里:

        private void btnOk_Click(object sender, EventArgs e)
        {
            timer.Start();
            progressBar.Visible = true;
            backgroundWorker.RunWorkerAsync();
           doSomeWork();
        }

 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            timer.Stop();
            progressBar.Visible = false;   
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("called");
            if (progressBar.Value == progressBar.Maximum)
            {
                progressBar.Value = progressBar.Minimum;
                return;
            }
            progressBar.PerformStep();
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;
        }

为什么它不在进度条中显示进度?有什么问题吗?

你的
后台工作人员没有做任何事情。在
DoWork
事件中移动
doSomeWork
。您需要将
ReportProgress
设置为
true

private void btnOk_Click(object sender, EventArgs e)
{
    timer.Start();
    progressBar.Visible = true;
    backgroundWorker.ReportsProgress = true;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    doSomeWork();
}

private void doSomeWork()
{
  //do what you want here..
  backgroundWorker.ReportProgress(yourprogresspercentagenumber);
  //do what you want again..
  backgroundWorker.ReportProgress(yourprogresspercentagenumber);
}

你的
backgroundWorker\u DoWork
没有做任何事情。在
DoWork
事件中移动
doSomeWork
。您需要将
ReportProgress
设置为
true

private void btnOk_Click(object sender, EventArgs e)
{
    timer.Start();
    progressBar.Visible = true;
    backgroundWorker.ReportsProgress = true;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    doSomeWork();
}

private void doSomeWork()
{
  //do what you want here..
  backgroundWorker.ReportProgress(yourprogresspercentagenumber);
  //do what you want again..
  backgroundWorker.ReportProgress(yourprogresspercentagenumber);
}

你在这里混合了两个概念。请决定是使用计时器还是后台工作程序

什么也没发生的原因是你的
后台工作人员什么都不做。因此后台工作程序立即完成,并调用
backgroundWorker\u RunWorkerCompleted
,再次停止计时器

从不调用
backgroundWorker\u ProgressChanged
,因为只有在调用时才会引发该事件(并且将
backgroundWorker.ReportsProgress
设置为
true

我认为您在
doSomeWork()
中所做的工作应该在报告进度时在
backgroundWorker\u DoWork
中完成。试试这样的事情:

private void btnOk_Click(object sender, EventArgs e)
{
    progressBar.Visible = true;
    backgroundWorker.ReportsProgress = true;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    doALittleWork();
    backgroundWorker.ReportProgress(10, null);
    doMoreWork();
    backgroundWorker.ReportProgress(20, null);
    //...
    doLastWork();
    backgroundWorker.ReportProgress(100, null);
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar.Visible = false;   
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}

这应该是你想要的。在这种情况下不需要计时器。

您在这里混合了两个概念。请决定是使用计时器还是后台工作程序

什么也没发生的原因是你的
后台工作人员什么都不做。因此后台工作程序立即完成,并调用
backgroundWorker\u RunWorkerCompleted
,再次停止计时器

从不调用
backgroundWorker\u ProgressChanged
,因为只有在调用时才会引发该事件(并且将
backgroundWorker.ReportsProgress
设置为
true

我认为您在
doSomeWork()
中所做的工作应该在报告进度时在
backgroundWorker\u DoWork
中完成。试试这样的事情:

private void btnOk_Click(object sender, EventArgs e)
{
    progressBar.Visible = true;
    backgroundWorker.ReportsProgress = true;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    doALittleWork();
    backgroundWorker.ReportProgress(10, null);
    doMoreWork();
    backgroundWorker.ReportProgress(20, null);
    //...
    doLastWork();
    backgroundWorker.ReportProgress(100, null);
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar.Visible = false;   
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}


这应该是你想要的。在这种情况下不需要计时器。

问题是它只显示进度,但不显示进度。
你的意思是什么?请查看编辑。
问题是它只显示进度,但不显示进度。
你的意思是什么?请查看编辑。进度条值在哪里更改?@testtest查看我的更新。您可以在
doSomeWork
函数中设置报告进度值。您是对的,我已经尝试过在progrss栏中显示进度,但使用这种方式实现的问题是,我的表单假设是隐藏自己(this.hide()),然后在doSomething()函数中弹出另一个表单,但即使我这样做,进度栏也会100%显示进度“backgroundWorker.ReportProgress(100,空);“在form2.showdialog()之后;但那是永远不会发生的popups@testtest这是一个不同的问题。请发布一个新的问题。进度条值在哪里更改?@testtest请查看我的更新。您可以在
doSomeWork
函数中设置报告进度值。您是对的,我已经尝试过在进度条中显示进度,但问题是使用这种方式实现的方法是,假设我的表单是隐藏自己(this.hide())并在doSomething()函数中弹出另一个表单,但即使是“backgroundWorker.ReportProgress(100,null)”,进度条也会100%地显示出来;“在form2.showdialog()之后;但那是永远不会发生的popups@testtest这是一个不同的问题。请为此发布一个新的问题。谢谢rene…如果你必须实现同样的目标,你会怎么做?请通过评论进行解释。非常感谢。你是对的,我已经尝试过在progrss栏中显示进度,但使用这种方式实现的问题是,M假设y表单隐藏自身(this.hide())并在doSomething()函数中弹出另一个表单,但进度条显示100%,即使是“backgroundWorker.ReportProgress”(100,null);“在form2.showdialog()之后;但该表单2从未弹出。@testtest这似乎是一个不同的问题,因此可能会为此发布一个新问题。谢谢rene…如果必须实现同样的目标,您将如何实现它?请通过评论进行解释。非常感谢。您是对的,我已经尝试过它,它在progrss栏中显示了进度,但使用这种方式会出现问题实现的方法是,假设我的表单隐藏自身(this.hide())并在doSomething()函数中弹出另一个表单,但即使我执行“backgroundWorker.ReportProgress(100,null)”,进度条也会100%显示;“在form2.showdialog()之后;但该form2从未弹出。@testtest这似乎是一个不同的问题,因此可能会为此发布一个新问题。