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
    } 
}

当然,这是一个精炼版本,没有 BackgroundWorker 一切都很好,但因为我想要一个响应更快的 UI,所以我尝试实现一个。但是工作人员没有更新网格(而标签正确)。有小费吗?

4

1 回答 1

1

您很可能在某处(可能在 MagicMethod 内部)导致异常,并且因为您不处理 Bgw RunWorkerCompleted 事件,所以您没有注意到它。

因此,添加一个 RunWorkerCompleted 事件并检查是否 e.Error != null

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

请参阅此 MSDN 示例并注意 RunWorkerCompleted 事件中的 if/else if/else 模式。

于 2009-12-17T11:04:34.437 回答