2015-11-17 95 views
0

我有2種形式。帶有一些代碼的主窗體和具有進度條的2窗體。雖然主要形式正在成爲無形的,第二種形式作爲線程apears:進度條和ThreadAbortException

Thread pb = new Thread(Show_pb); //Show_pb shows the 2 form with green progress bar 
pb.Start(); 
this.ShowInTaskbar = false; 
this.Visible = false; 

//do smth... 

    pb.Abort();   
    this.Visible = true; 
    this.ShowInTaskbar = true; 
    this.Activate(); 

畢竟有時它拋出一個異常:

線程已被中止

如果我在Show_pb中創建try..catch它會每次都拋出:

try 
    { 
     Form2 f_pb = new Form2(); 
     f_pb.ShowDialog(); 
     f_pb.Activate(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

但我無法處理系統拋出的異常。我應該改變什麼或如何處理這個異常?

+1

永遠不要調用'Thread.Abort()'。相反,設置一個'ManualResetEvent'或其他東西,讓線程定期檢查它是否應該退出。 –

+1

使用'BackgroudWorker'控件。 – Irshad

+0

@Irshad如果OP使用相同的機制從後臺工作線程退出,那麼這本身並沒有幫助。 –

回答

2

參見ThreadAbortException Class文檔:

當呼叫到Abort方法制成摧毀一個線程,該 公共語言運行時會引發一個ThreadAbortException。 ThreadAbortException是一個特殊的異常,可以被捕獲,但它會在catch塊的末尾再次自動提升。

您無法有效地發現此異常。

首先,你不應該打電話Thread.Abort除非你的整個應用程序正在關閉。它也可以讓你的應用程序處於未知狀態。

接下來的事情是,你似乎是在非UI線程中啓動一些UI。那很糟。你真的不應該這樣做。

正確的方法是在後臺線程中運行計算並將更新編組回到UI以更新進度欄。