2009-12-17 39 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