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 に答える