为什么我在我的线程C#应用程序中得到TargetInvocationException?

时间:2012-10-02 14:15:48

标签: c# multithreading delegates

以下是代码(以简单形式):

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个函数find1find2,这些是长时间处理函数。我想在BackgroundThread上运行这两个函数,所以我创建了一个委托。当我调用一个函数时,委托获取函数的地址或另一个函数的地址。 当我启动线程时,我传递委托而不是直接键入函数,所以我不会创建2个后台线程,每个线程都有自己的事件和东西。 但是我遇到了问题,当我运行程序时,会抛出以下错误:

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

它与传递给线程的委托有关。当然,我可以用条件编写更简单的东西来查看必须运行的函数,但是我进入了这个并且我不知道如何解决它。我想知道我做错了什么。

2 个答案:

答案 0 :(得分:0)

我认为,在您的DoWork函数中,您需要像这样调用委托:

e.Result = deleg();

原因是这实际上会调用函数,而不是仅仅将结果设置为对函数的引用。

答案 1 :(得分:0)

您正在为DataTable

投射代表
dataGridView1.DataSource = (DataTable)e.Result;

来自这里:

e.Result = deleg;

你的意思是:

e.Result = deleg();