下面是代碼(以簡單的形式):爲什麼在我的線程化C#應用程序中得到TargetInvocationException?
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."
它與傳遞給線程的委託做的。當然,我可以用條件寫一切簡單的東西來看看哪些函數需要運行,但我陷入了這個問題,我不知道如何解決它。我想知道我做錯了什麼。
謝謝,它解決了這個問題。我在那裏做了一個錯誤的判斷。 乾杯。 –