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