后台工作者挂起整个应用程序

时间:2011-10-07 17:30:26

标签: c# .net backgroundworker hang

好的,这是非常轻松的代码:

// 
// numConfigsBindingSource
// 
this.numConfigsBindingSource.DataMember = "NumConfigs";
this.numConfigsBindingSource.DataSource = this.DSNumConfigs;

// Grid
this.GridNumConfigs.DataSource = this.numConfigsBindingSource;

// 
// DSNumConfigs
// 
this.DSNumConfigs.DataSetName = "DSNumConfigs";
this.DSNumConfigs.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
// 
// numConfigsTableAdapter
// 
this.numConfigsTableAdapter.ClearBeforeFill = false;
//
// 
// DSConfigNumbers
// 
this.DSConfigNumbers.DataSetName = "DSConfigNumbers";
this.DSConfigNumbers.EnforceConstraints = false;
this.DSConfigNumbers.SchemaSerializationMode =       System.Data.SchemaSerializationMode.IncludeSchema;

private void Form1_Load(object sender, EventArgs e)
{                
    worker.RunWorkerAsync();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    this.numConfigsTableAdapter.Fill(this.DSNumConfigs.NumConfigs);                    
}

然后我在VS2010下运行这个代码,它可以找到,但是当我运行发布应用程序时,它就悬空了。但是如果我重写这个没有使用BackgroundWorkers的代码,那么它的工作正常。 我是否需要一些努力来明确释放后台工作人员?我试图锁定Form1_Load中的工人类,但它没有取得任何成功。还尝试在this.DSNumConfigs中锁定DoWork,也没有任何成功的东西。

1 个答案:

答案 0 :(得分:1)

好吧,你做的事情不安全:你在非UI线程上访问UI。您没有这样做显式,但您的UI已绑定到您的表适配器。

您可能想要解除绑定,然后运行后台工作程序,然后(在已完成的事件上)重新绑定UI。

我很惊讶当你在调试器中运行它时没有抛出异常,说实话......