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工作,但我希望绑定和解除绑定都非常简单……哦,是的,这比我预期的要容易得多:)