0

コードは次のとおりです(単純な形式)。

delegate DataTable Functie();
Functie deleg;

DataTable find1()
{
    return new DataTable();
}
DataTable find2()
{
    return new DataTable();
}


private void btnFind1_Click(object sender, EventArgs e)
{
    deleg = this.find2;
    backgroundWorker1.RunWorkerAsync();
}


private void btnFind2_Click(object sender, EventArgs e)
{
    deleg = this.find1;
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bk = sender as BackgroundWorker;
    e.Result = deleg;

    if (bk.CancellationPending)
    {
        e.Cancel = true;
    }
}


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("Operation was canceled");
    }
    else if (e.Error != null)
    {
        MessageBox.Show("An error occurred: " + e.Error.Message);
    }
    else
    {
        dataGridView1.DataSource = (DataTable)e.Result;
    }
}

つまり、基本的に2つの機能がfind1ありfind2、これらは長時間処理機能です。これらの2つの関数をで実行したいBackgroundThreadので、デリゲートを作成しました。1つの関数を呼び出すと、デリゲートは関数または他の関数のアドレスを取得します。スレッドを開始するとき、関数を直接入力する代わりにデリゲートを渡すので、それぞれが独自のイベントなどを持つ2つのバックグラウンドスレッドを作成しません。しかし、問題が発生しました。プログラムを実行すると、次のエラーがスローされます。

"System.Reflection.TargetInvocationException was unhandled
Exception has been thrown by the target of an invocation."

これは、スレッドに渡されたデリゲートと関係があります。もちろん、どの関数を実行する必要があるかを確認するための条件を使用して、すべてをより単純に書くことはできますが、これに取り掛かり、解決方法がわかりませんでした。何が悪かったのか知りたい。

4

2 に答える 2

0

DoWork関数では、次のようにデリゲートを呼び出す必要があると思います。

e.Result = deleg();

その理由は、結果を関数への参照と等しく設定するのではなく、実際に関数を呼び出すためです。

于 2012-10-02T14:20:11.730 に答える
0

デリゲートをDataTable:にキャストしています

dataGridView1.DataSource = (DataTable)e.Result;

ここから来ました:

e.Result = deleg;

もしかして:

e.Result = deleg();
于 2012-10-02T14:22:03.803 に答える