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

C# 后台工作程序挂起整个应用程序,c#,.net,backgroundworker,freeze,C#,.net,Backgroundworker,Freeze,好的,这是非常简单的代码: // // numConfigsBindingSource // this.numConfigsBindingSource.DataMember = "NumConfigs"; this.numConfigsBindingSource.DataSource = this.DSNumConfigs; // Grid this.GridNumConfigs.DataSource = this.numConfigsBindingSource; // // DSNu

好的,这是非常简单的代码:

// 
// 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
,它就可以正常工作。
我需要一些努力来清楚地释放后台工作人员吗?我试图将worker类锁定在
Form1\u Load
中,但没有成功。也尝试在
DoWork
中锁定
此.dsnumconfig
,也没有任何成功的东西。

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

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


我很惊讶,当您在调试器中运行它时,它没有抛出异常,老实说…

您有任何绑定到表适配器的控件吗?一个简短但完整的例子在这里真的很有帮助…是的,我有一个绑定到DSNumConfigs的网格在我的网站上有一篇关于在windows窗体上运行后台线程的文章。。。虽然它不使用后台工作人员,但它可能对您有所帮助。无论如何希望这能提供一些你可以尝试的东西@请看我编辑的帖子。@kseen:请看我的答案:)非常感谢John!你能给我一些如何做的例子吗?@kseen:你觉得哪一点困难?我不能说我做了很多GUI工作,但我希望绑定和解除绑定都非常简单……哦,是的,这比我预期的要容易得多:)