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

所以,基本上我有两个功能find1find2这些都是长时间处理的功能。我想在一个上运行这两个函数,BackgroundThread所以我创建了一个委托。当我调用一个函数时,委托会获取一个函数或另一个函数的地址。当我启动线程时,我传递委托而不是直接键入函数,因此我不会创建 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 回答