我正在用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上。
答案 0 :(得分:0)
似乎答案是我经常调用 bgw.ReportProgress((int)percentComplete); ---更改代码以便它只报告每几个百分点似乎都解决了这个问题。