C# BackgroundWorker.ReportProgress中断方法
似乎无论我在BackgroundWorker上调用ReportProgress,该方法的处理都会停止,因此我的工作永远不会完成。例如:C# BackgroundWorker.ReportProgress中断方法,c#,wpf,progress-bar,backgroundworker,C#,Wpf,Progress Bar,Backgroundworker,似乎无论我在BackgroundWorker上调用ReportProgress,该方法的处理都会停止,因此我的工作永远不会完成。例如: int numQuals = this.Model.Names.Count(); int currentQual = 0; int fivePercent = (int)(numQuals * .05); foreach (var qualName in this.Model.Names) { if ((worker != null) &&
int numQuals = this.Model.Names.Count();
int currentQual = 0;
int fivePercent = (int)(numQuals * .05);
foreach (var qualName in this.Model.Names)
{
if ((worker != null) && ((currentQual % fivePercent == 0)))
{
worker.ReportProgress((int) (((float)++currentQual / numQuals) * 100));
}
// This next line never processes. I can debug and it will
// break at the ReportProgress line but won't ever break here
this.myContainer.Add(...
}
有人知道这是为什么吗?您是否设置了worker.WorkerReportsProgress=true?否则,后台工作人员将异常终止,工作将无法完成。我建议将您的计算逻辑分离到另一行。我讨厌看到来自其他开发人员的类似内联的东西。它更难阅读,也更难调试(正如您的问题所指出的) 如果您在do work方法中,则worker永远不应为null。尽管我确实建议执行空检查——如果这里存在空值,那么其他的东西就大错特错了
if ((worker != null) && ((currentQual % fivePercent == 0)))
{
object result = ((float)++currentQual / (float)numQuals) * 100;
int resultint = 0;
if(Int32.TryParse(result.ToString(), out resultint))
{
worker.ReportProgress(Convert.ToInt32(result));
}
}
调试+异常,勾选抛出复选框。并添加代码来处理RunWorkerCompleted事件处理程序中的e.Error。您发布的内容不会告诉我们任何信息。把你的密码贴出来怎么样ReportProgress@Ramhound例如他不能。是.NET Framework的一部分。所有的
ReportProgress
操作都是引发ProgressChanged
事件。如果这是阻塞,那么他的事件处理程序就是阻塞。我们需要查看他的事件处理程序。@Kristip:然后您必须向调试程序进行检查。请注意,如果ReportProgress事件中有任何错误代码,这将中断后台工作程序的执行。这意味着错误要么在调用ReportProgress的行中(除零或类似的内容),要么在ReportProgress eventhandler中。是的,事实证明在eventhandler中有一个愚蠢的错误导致了异常。这就是为什么我不应该偷懒,总是确保我检查e.错误,正如@Hans Passant所说的。