好的,这是非常轻松的代码:
//
// 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
,也没有任何成功的东西。
答案 0 :(得分:1)
好吧,你做的事情不安全:你在非UI线程上访问UI。您没有这样做显式,但您的UI已绑定到您的表适配器。
您可能想要解除绑定,然后运行后台工作程序,然后(在已完成的事件上)重新绑定UI。
我很惊讶当你在调试器中运行它时没有抛出异常,说实话......