2009-02-06 85 views
0

使用.Net Framework 1.1,有哪些選項可用於監視來自其他線程的線程?我試圖解決1.1中線程實現的缺點,其中未處理的異常會導致線程無聲地死去。在2.0及更高版本中,這已得到糾正,以便任何線程上的任何未處理的異常都會導致整個應用程序死亡,我相信。C#1.1:監視工作線程

當我的應用程序中的線程死亡時,我想從主線程中檢索儘可能多的上下文:它們正在執行的方法,堆棧跟蹤等。我可以確定它們何時死亡但檢索上下文已證明很困難。我曾嘗試註冊AppDomain.CurrentDomain.UnhandledException事件的處理程序。但是當事件發生時,我不會回電。這可能是由於我正在開發的API的限制。

除了這個事件,有什麼選擇可以從線程獲取上下文,因爲它們死於另一個線程?

+0

未處理的異常線程的事件是Application.ThreadException。 – VBNight 2009-02-06 21:07:16

回答

4

你是如何創建這些線程?你是否將一個委託添加到線程池?如果是這樣,你可以創建一個包裝方法,它接受所提供的委託幷包裝另一個委託來處理你的try/catch,然後把這個新的委託添加到線程池隊列中。這樣你可以在第二個委託中放入你的錯誤處理代碼。

0

對於由線程ID索引的映射中的每個線程的遞增計數如何?當它停止遞增時,它已經死亡並且有時間殺死和/或重新啓動它。該地圖可以包含您管理所有這些以及在主持線程和那些討厭的小孩子之間共享信息所需的一切。

+0

我可以通過檢查Thread.IsAlive或Thread.ThreadState屬性來判斷線程何時死亡。我遇到的問題是,當他們死後,在另一個線程之後,檢測到線程中發生了什麼。 – Chris 2009-02-06 20:56:26

+0

聽起來像是日誌文件的作業。 – kenny 2009-02-08 12:27:05

0

我會創造,將帶你通常會傳遞到線程回調,然後有一個叫裏面的一些包裝代碼,您將使用在線程跟蹤例外,像這樣的方法:

public class ThreadStarter 
{ 
    ThreadStart start; 

    public ThreadStarter(ThreadStart start) 
    { 
    this.start = start 
    } 

    public void Run() 
    { 
    // Create the thread. 
    Thread t = new Thread(new ThreadStart(InternalRun)); 
    t.Start(); 
    } 

    private void InternalRun() 
    { 
    // Wrap in a try/catch. 
    try 
    { 
     // Run the code. 
     start(); 
    } 
    catch (Exception e) 
    { 
     // Process exception here. 
    } 
    } 
} 
1

您可以嘗試添加一個線程異常處理程序:

System.Threading.ThreadExceptionEventArgs e將包含有關未處理的異常的信息。

// Setup Default Thread Exception Handler 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 


static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    // Insert Code 
} 

來源:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx