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