在C#上使用backgroundworker的OutOfMemory Exception:没有backgroundworker就可以正常工作

时间:2014-04-08 12:28:58

标签: c# out-of-memory backgroundworker

我正在用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();            
}

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

1 个答案:

答案 0 :(得分:0)

似乎答案是我经常调用 bgw.ReportProgress((int)percentComplete); ---更改代码以便它只报告每几个百分点似乎都解决了这个问题。