2012-10-02 55 views
0

下面是代碼(以簡單的形式):爲什麼在我的線程化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個功能find1find2並且這些長時處理功能。我想在BackgroundThread上運行這兩個函數,所以我創建了一個委託。當我調用一個函數時,委託需要一個函數或另一個函數的地址。 當我啓動線程時,我傳遞委託而不是直接鍵入函數,所以我不會創建2個後臺線程,每個線程都有自己的事件和內容。 但我遇到問題,當我運行該程序,下面的錯誤被拋出:

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

它與傳遞給線程的委託做的。當然,我可以用條件寫一切簡單的東西來看看哪些函數需要運行,但我陷入了這個問題,我不知道如何解決它。我想知道我做錯了什麼。

回答

0

我想,在你的DoWork的功能,你需要調用該委託是這樣的:

e.Result = deleg(); 

的原因是,這實際上會調用該函數,而不是僅僅把結果等於爲參考功能。

+0

謝謝,它解決了這個問題。我在那裏做了一個錯誤的判斷。 乾杯。 –

0

你鑄造一個委託到DataTable

dataGridView1.DataSource = (DataTable)e.Result; 

這些來自這裏:

e.Result = deleg; 

你的意思是:

e.Result = deleg(); 
+1

邑,你是對的,很好的答案:) –

+0

@kristi_io:你可以標記答案爲接受,如果它解決了你的問題。 – Tudor

+0

標出答案;) –

相關問題