以下是代码(以简单形式):
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
,这些是长时间处理函数。我想在BackgroundThread
上运行这两个函数,所以我创建了一个委托。当我调用一个函数时,委托获取函数的地址或另一个函数的地址。
当我启动线程时,我传递委托而不是直接键入函数,所以我不会创建2个后台线程,每个线程都有自己的事件和东西。
但是我遇到了问题,当我运行程序时,会抛出以下错误:
"System.Reflection.TargetInvocationException was unhandled
Exception has been thrown by the target of an invocation."
它与传递给线程的委托有关。当然,我可以用条件编写更简单的东西来查看必须运行的函数,但是我进入了这个并且我不知道如何解决它。我想知道我做错了什么。
答案 0 :(得分:0)
我认为,在您的DoWork函数中,您需要像这样调用委托:
e.Result = deleg();
原因是这实际上会调用函数,而不是仅仅将结果设置为对函数的引用。
答案 1 :(得分:0)
您正在为DataTable
:
dataGridView1.DataSource = (DataTable)e.Result;
来自这里:
e.Result = deleg;
你的意思是:
e.Result = deleg();