【问题标题】:OutOfMemory Exception using backgroundworker on C# : works fine without backgroundworker在 C# 上使用 backgroundworker 的 OutOfMemory 异常:在没有 backgroundworker 的情况下工作正常
【发布时间】:2014-04-08 12:28:57
【问题描述】:

我正在用 C# 编写一个项目,但在运行昂贵的进程时使用 backgroundworker 来保持表单响应时遇到了问题。当我使用 bgw 方法时,我得到一个 OutOfMemory 异常。但是,如果我直接运行我的 ExpensiveMethod() 而不使用 bgw,那么我没有任何问题。有任何想法吗?我真的希望能够在此方法运行时实现进度条(这是一个非常耗时的过程,用户需要知道还剩多长时间)。我对 C# 相当陌生,绝对是线程的新手。

这是我如何实现我的 bgw 和 ExpensiveMethod():

 private void btnGo_Click(object sender, EventArgs e)
 {
     myProgressBar.Visible = true;
     bgw.RunWorkerAsync();           
 }


 private void bgw_DoWork(object sender, DoWorkEventArgs e)
 {
     ExpensiveMethod();
 }

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

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


private void ExpensiveMethod()
{
    // do a big calculation and call this every so often:
    bgw.ReportProgress((int)percentComplete);

}

然而,这种方法在没有内存异常的情况下工作正常,但显然在运行时会锁定表单:

private void btnGoThatWorks_Click(object sender, EventArgs e)
{
    ExpensiveMethod();            
}

有什么想法吗?我在 Windows7 32 位。

【问题讨论】:

  • 我们如何从bgwbgwAntenna ?这里是什么平台?如何/何时订阅事件?
  • 确保在 bgwAntenna.ReportProgress() 中传递整数值;引发后台工作人员的 ProgressChanged 事件。
  • 不明显。 ExpensiveMethod() 不调用UpdateSomeFieldsOnForm(),所以内存泄漏可能在后一种方法内部?
  • 忽略对 bgwAntenna 的引用,这只是将我的名称更改为通用名称时的拼写错误。我可以删除 UpdateSomeFieldsOnForm() 方法,但问题仍然存在。我肯定会将 (int) 传递给 reportprogress 方法。
  • 我们真的需要看看 ExpensiveMethod() 是什么才能帮助你。您发布的代码不会导致任何问题。

标签: c# out-of-memory backgroundworker


【解决方案1】:

答案似乎是我调用 bgw.ReportProgress((int)percentComplete); 过于频繁 --- 更改代码使其仅报告每百分之几似乎都解决了这个问题。

【讨论】:

  • 我认为这不是 OutOfMemoryException 的根本原因,频繁报告进度会损害程序的性能,但不会导致累积内存消耗。 OutOfMemoryException 很有意思……很多时候我都能发现是无意的递归方法调用导致的……然后我就可以愉快地修复了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2012-05-05
  • 2017-10-24
相关资源
最近更新 更多