2011-10-07 54 views
0

確定這裏是美麗的光代碼:背景工人掛起整個應用程序

// 
// 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.DSNumConfigsDoWork也沒有任何成功的東西。

+1

您是否有任何控件綁定到表適配器?一個簡短的*完整的*例子真的可以幫助這裏... –

+0

是的,我有一個網格綁定到DSNumConfigs – kseen

+0

在我的網站上有一篇關於在Windows窗體上運行後臺線程的文章...它可能對你有一些幫助儘管它不使用後臺工作人員。無論如何...希望這提供了一些你可以嘗試... http://www.idevforfun.com/index.php/2010/01/10/windows-ui-threading/ – iDevForFun

回答

1

嗯,你正在做一些不安全的事情:你在非UI線程上訪問UI。你沒有這樣做明確,但你的用戶界面綁定到您的表適配器。

您可能想要解除綁定,然後然後運行後臺工作者,然後(在完成的事件上)重新綁定UI。

我很驚訝它在調試器中運行時沒有拋出異常,說實話...

+0

非常感謝John!你能給我一些樣品怎麼做嗎? – kseen

+0

@ kseen:你覺得哪一點困難?我不能說我做了很多圖形用戶界面的東西,但我希望綁定和解綁都是非常簡單的... –

+0

哦,是的,這比我期待的要容易得多:) – kseen