2009-12-17 67 views
0

說我有下面的類/表格(半僞):問題的背景工人

public partial class X : Form 
{ 
    private DataTable dt; 
    private BackgroundWorker bg; 

    public X() 
    { 
     dt.Columns.Add("A"); 
     dt.Columns.Add("B"); 
     dt.Columns.Add("C"); 
    } 

    private void button_Click(...) 
    { 
     bg = new BackgroundWorker(); 
     bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
     bg.RunWorkerAsync(); 
    } 

    private void bg_DoWork(...) 
    { 
     // do some stuff 
     MagicMethod(parameters); 

     // doesnt work, how to fix this? 
     dataGridView1.Invoke((Action)delegate { dataGridView1.DataSource = dt; }); 
    } 

    private void MagicMethod(params) 
    { 
     // update a label, WORKS 
     label1.Invoke((Action) delegate { label1.Text = "somestuff" } 

     // do some stuff to fill the datatable 
    } 
} 

Ofcourse,這是一個精華版本,沒有BackgroundWorker的一切是合理的,但因爲我想一個更靈活的UI我嘗試實施一個。但是網格不會被工作人員更新(而標籤卻正確)。有小費嗎?

+0

如果您可以提供一個簡短但完整的示例,那將會更容易幫助您。 – 2009-12-17 10:56:16

+0

激活調試>例外>公共語言運行時例外>引發並檢查失敗。你提供的代碼工作。 – jmservera 2009-12-17 11:07:02

回答

1

您可能在某處(可能在MagicMethod內)導致異常,並且您不處理Bgw RunWorkerCompleted事件,但您沒有注意到它。

所以,加RunWorkerCompleted事件,並檢查是否e.Error != null

完成的事件也處理結果的方便和安全的地方:dataGridView1.DataSource = dt;

this MSDN example和注意的if/else,如果/ RunWorkerCompleted事件中的其他模式。

+0

我不明白,我在RunWorkerCompleted事件中沒有得到一個顯示錯誤:s – Oxymoron 2009-12-17 12:04:35

+0

那麼dataGridView1.DataSource!= null'在完成時如何?我們現在正在調查性調試。 – 2009-12-17 13:18:18

+0

當我檢查當地人時,我發現DataSource包含52行。 HasErrors被設置爲false,但仍然沒有雪茄。我缺乏線程經驗真的在這裏顯示:( 我在這個答覆下發布了代碼 – Oxymoron 2009-12-17 13:49:14