Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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_Devexpress_Progress Bar_Backgroundworker - Fatal编程技术网

C# 后台工作进程中的进度条工作不正常

C# 后台工作进程中的进度条工作不正常,c#,.net,devexpress,progress-bar,backgroundworker,C#,.net,Devexpress,Progress Bar,Backgroundworker,我需要有一个进度条在一个进程的时候工作(可见),然后可见性应该设置为false。我正在为此过程使用后台工作人员。但是,在使用visibility属性时,应用程序正在停止运行,而在其他方面,应用程序正在正常运行。我正在使用Devexpress进度条。请帮助我完成此操作。这是我正在使用的代码 private void Generate_Click(object sender, EventArgs e) { backgroundWorker1.WorkerReportsProg

我需要有一个进度条在一个进程的时候工作(可见),然后可见性应该设置为false。我正在为此过程使用后台工作人员。但是,在使用visibility属性时,应用程序正在停止运行,而在其他方面,应用程序正在正常运行。我正在使用Devexpress进度条。请帮助我完成此操作。这是我正在使用的代码

private void Generate_Click(object sender, EventArgs e)
    {
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.RunWorkerAsync();
    }
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int a = 0;
        int b = 0;
        ProgressBar.Visible = true;
        ProgressBar.Properties.Step = 1;
        ProgressBar.Properties.PercentView = true;
        ProgressBar.Properties.Maximum = SpecInformations.TotalSPCOCount;
        ProgressBar.Properties.Minimum = 0;
        Method_Call(a,b, sender as BackgroundWorker);
    }

    private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ProgressBar.PerformStep();
        ProgressBar.Update();
    }

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

代码可以帮助您在BackgroundWorker中使用进度条:

private void cmdButton_Click(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerAsync();
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 0; i < 101; i++)
        {
            worker.ReportProgress(i);
            System.Threading.Thread.Sleep(1000);
        }
    }

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        lblProgress.Text = ("Progress: " + e.ProgressPercentage.ToString() + "%");
    }
private void cmdButton\u单击(对象发送者,事件参数e)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=新的doworkereventhandler(worker\u DoWork);
worker.ProgressChanged+=新的progresschangedventhadler(worker\u ProgressChanged);
worker.RunWorkerAsync();
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(1000);
}
}
私有void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
lblProgress.Text=(“进度:+e.ProgressPercentage.ToString()+“%”);
}

有关其他信息,请使用

您不能从DoWork方法或其调用的任何方法内部访问Windows控件,如ProgressBar,因为运行此代码的线程是后台线程,而不是创建控件的线程。如果您尝试,您将得到一个异常,该异常的消息表示控件正在被创建它的线程以外的线程访问。这是关于windows控件的不可侵犯的规则;它们必须始终只能由创建它们的线程访问

BackgroundWorker有一个必须设置为true的
WorkerReportsProgress
属性和一个
ReportProgress()。当您在DoWork中调用此方法时,BackgroundWorker将自动引发ProgressChanged事件,关键是,它使用创建它时使用的前台线程(与创建其他控件时使用的线程相同)来执行此操作因此,ProgressChanged事件处理程序中的代码是使用适当的线程运行的,并且可以访问ProgressBar控件而不会导致异常

总之:

  • 将WorkerReportsProgress设置为true
  • 在DoWork内部调用ReportProgress,传递完成百分比或使用int表示流程已达到某个阶段(不必是百分比)
  • 将事件处理程序附加到工作人员的ProgressChanged事件
  • 将ProgressBar代码移动到ProgressChanged事件处理程序

谢谢..这起作用了,我将进度条visible属性从后台工作程序中移出。将其作为一个单独的方法编写,并将其命名为“BackgroundWorker1_RunWorkerCompleted()”。啊,是的-我应该更仔细地检查代码,并建议您只需将所有这些调用移到doWork中的ProgressBar,在那里设置进度条并使其可见,然后改为单击Generate_。他们不工作,因为DoWork不允许访问控件;我没有滚动代码,也没有看到您实际正确设置了其余的进度和事件等:)