这是代码(以简单的形式):
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;
}
}
所以,基本上我有两个功能find1
,find2
这些都是长时间处理的功能。我想在一个上运行这两个函数,BackgroundThread
所以我创建了一个委托。当我调用一个函数时,委托会获取一个函数或另一个函数的地址。当我启动线程时,我传递委托而不是直接键入函数,因此我不会创建 2 个后台线程,每个线程都有自己的事件和内容。但是我遇到了问题,当我运行程序时,会抛出以下错误:
"System.Reflection.TargetInvocationException was unhandled
Exception has been thrown by the target of an invocation."
它与传递给线程的委托有关。当然,我可以用条件编写所有更简单的东西,以查看必须运行哪些函数,但是我进入了这个,我不知道如何解决它。我想知道我做错了什么。