2017-08-19 111 views
-1

我已經構建了一個應用程序,使用Application.Run(new Form)啓動表單。在該應用程序有以下這個線程函數關閉時引發的異常應用程序

private void threadTask() { 
    while (true) { 
    Thread.Sleep(500); 
     if (isOn) { 
     Invoke((MethodInvoker) delegate { reloadData(tabControl.SelectedIndex); }); 
     Invoke((MethodInvoker) delegate { onOffButton.BackColor = Color.Lime; }); 
     Invoke((MethodInvoker) delegate { infoLabel.Visible = false; }); 
    } 
    } 
} 

當我關閉應用程序,我得到這個異常:在 「System.InvalidOperationException」 System.Windows.Forms.dll的

拋出異常

在System.Windows.Forms.Control.Invoke(委託方法,對象[]參數)

我已經試圖通過在窗體關閉時調用Application.Exit()來解決此問題。該函數被執行,但是,我仍然在Application.Exit()被調用後得到異常。

有什麼方法可以解決這個問題嗎?如何檢查應用程序是否已關閉?

+1

在vs中調試並檢查至極線是否通過異常。我想你需要終止線程退出應用程序 – lvl4fi4

+0

這是非常隨機的。我發生在三條Invoke行中的任何一行,有時根本就沒有。 –

+0

所以就像我說你必須終止他們退出應用程序 – lvl4fi4

回答

2

當線程仍在運行時您的窗體被關閉時,可能在窗體關閉之後以及線程被中止之前調用其中一個調用。 該調用嘗試在窗體的UI線程(不再運行)的上下文中執行委託。

解決方案:您需要使用一種可以阻止線程運行的機制(在窗體的OnClosing事件中)。

我建議使用Task(請參閱https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming),您可以使用CancellationToken來取消。

注意:在Task中,在調用Invoke方法之前,您需要檢查CancellationToken以確保僅在沒有取消請求時才調用它們。

+2

你可以用CancellationToken取消任何東西。它只會存儲取消請求。如果有這樣的請求,你可以詢問令牌。這不僅限於任務,你可以在任何情況下做到這一點 –

+0

@Sir Rufo:你的評論當然是隱含在我的回答中,並在包含的鏈接中加以解釋...... –

相關問題