2009-02-06 84 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