Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# Backgroundworker赢得';不要报告进展_C#_Wpf_Backgroundworker_Progress - Fatal编程技术网

C# Backgroundworker赢得';不要报告进展

C# Backgroundworker赢得';不要报告进展,c#,wpf,backgroundworker,progress,C#,Wpf,Backgroundworker,Progress,我有一个后台工作人员正在运行一个很长的数据库任务。我想在任务运行时显示进度条。不知何故,后台工作人员不会报告任务的进度 这就是我所拥有的: BackgroundWorker _bgwLoadClients; _bgwLoadClients = new BackgroundWorker(); _bgwLoadClients.WorkerReportsProgress = true; _bgwLoadClients.DoWork += new DoWorkEventHandler(_bgwLoad

我有一个后台工作人员正在运行一个很长的数据库任务。我想在任务运行时显示进度条。不知何故,后台工作人员不会报告任务的进度

这就是我所拥有的:

BackgroundWorker _bgwLoadClients;

_bgwLoadClients = new BackgroundWorker();
_bgwLoadClients.WorkerReportsProgress = true;
_bgwLoadClients.DoWork += new DoWorkEventHandler(_bgwLoadClients_DoWork);
_bgwLoadClients.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bgwLoadClients_RunWorkerCompleted);
_bgwLoadClients.ProgressChanged += new ProgressChangedEventHandler(_bgwLoadClients_ProgressChanged);
_bgwLoadClients.RunWorkerAsync(parms);

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e)
{
    DataTable dt = getdate();
    e.Result = dt;
}

void _bgwLoadClients_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}
我在WPF中做这件事,但我想这不会有什么不同


提前感谢

请报告嫁妆活动的进展情况

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) {
    int progresValue0to100 = 75;
    (sender as System.ComponentModel.BackgroundWorker).ReportProgress(progresValue0to100);
    //do your jobs..
}

它的工作原理如下

您必须手动调用以引发事件。

您需要在DoWork方法中调用worker.ReportProgress(完成百分比)。 应根据总工作量计算完成百分比。例如:

for(int i =0; i != 100; i++) {
    // do something
    worker.ReportProgress(i);
}

有时很难将一个作业分成几个部分,以便能够报告进度。不幸的是,BackgroundWorker无法解决此问题,您必须自己解决。

您需要将您的DoWork方法分解为可报告的进度,然后调用ReportProgress

以以下为例:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{
    // If possible, establish how much there is to do
    int totalSteps = EstablishWorkload();

    for ( int i=0; i<totalSteps; i++)
    {
        // Do something...

        // Report progress, hint: sender is your worker
        (sender as BackgroundWorker).ReportProgress((int)(100/totalSteps)*i, null);
    }

}

必须通过调用BackgroundWorker上的ReportProgress方法从DoWork事件中发送进度。在您的情况下,您不能报告任何进度,因为所有工作都是在DoWork函数之外完成的。只能在调用getdate()之前和之后报告进度,但由于BackgroundWorker线程正忙,因此不能在调用期间执行此操作。

在属性窗口或代码中将BackgroundWorker对象的WorkReportProgress属性修改为true

如果在键入(或编辑)问题时将代码缩进四个空格,它将以缩进和格式显示,就像代码一样,而不是拼凑成一个段落,难以阅读。你似乎没有调用BackgroundWorker的.ReportProgress方法-这仅仅是因为你向我们展示了一些简化的代码吗?@Mike,我认为这可能是原因,而不是过度编辑一个示例。我不能调用ReportProgress方法,因为我只做了一件事,在Dowork方法中只做了一件事。我可以在getdate()调用前后放置一个.ReportProgress,但是在调用getdata()时,进度条从不前进..如果您所做的事情没有分步骤进行,那么它是否确定需要多长时间?否则,您将无法报告除0%或100%之外的任何内容。您可能需要使用不确定的进度条。编程不错,数学不好;-)(int)(100.0/totalSteps*i)如果他们从一开始就默认为true,那就可以节省我20分钟!或者当有人呼叫ReportProgress时,让它成为现实。或者抛出一个更好的异常。谢谢你,伙计!
private void Something_DoWork(object sender, DoWorkEventArgs e) 
{
    // some work

    (sender as BackgroundWorker).ReportProgress(25, null);

    // some work

    (sender as BackgroundWorker).ReportProgress(50, null);

    // some work

    (sender as BackgroundWorker).ReportProgress(60, null);

    // some work

    (sender as BackgroundWorker).ReportProgress(99, null);
}