首页 文章

C#1.1:监视工作线程

提问于
浏览
0

使用.Net Framework 1.1,有哪些选项可用于监视来自其他线程的线程?我试图处理1.1中线程实现的缺点,其中未处理的异常将导致线程无声地死亡 . 在2.0及更高版本中,这已得到纠正,因此任何线程上的任何未处理的异常都将导致整个应用程序死亡,我相信 .

当我的应用程序中的线程死亡时,我想从主线程中检索尽可能多的上下文:它们正在执行的方法,堆栈跟踪等 . 我可以确定它们何时死亡但是检索上下文已经证明是困难的 . 我已经尝试为 AppDomain.CurrentDomain.UnhandledException 事件注册处理程序 . 但是当事件发生时我没有回电话 . 这可能是由于我正在开发的API的限制 .

除了这个事件,还有哪些选项可以从线程获取上下文,因为它们在另一个线程上死掉了?

4 回答

  • 4

    你是如何创建这些线程的?您是否在线程池中添加了委托?如果是这样,您可以创建一个包装器方法,该方法接受所提供的委托并包装它周围的另一个委托,它负责您的try / catch,然后将该新委托添加到线程池队列中 . 这样你就可以在第二个委托中输入你的错误处理代码 .

  • 0

    您可以尝试添加线程异常处理程序:

    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

  • 0

    如何通过线程ID索引的映射中每个线程的递增计数?当它停止递增时,死亡和时间被杀死和/或重新启动它 . Map 可以包含管理所有这些所需的一切,并在托管线程和那些讨厌的小孩之间共享信息 .

  • 1

    我将创建一个方法,它将接受您通常会传递给线程的回调,然后在一些包装器代码中调用,您将用它来跟踪线程中的异常,如下所示:

    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.
        }
      }
    }
    

相关问题