【问题标题】:C# 1.1: Monitoring worker threadsC# 1.1:监控工作线程
【发布时间】:2009-02-06 20:40:51
【问题描述】:

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

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

除了这个事件之外,当线程死在另一个线程上时,还有哪些选项可用于从线程获取上下文?

【问题讨论】:

  • 未处理线程异常的事件是Application.ThreadException。

标签: c# .net multithreading


【解决方案1】:

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

【讨论】:

  • 这是我最近听到的最聪明的想法之一。如果没有其他办法,我可能不得不这样做。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    按线程 ID 索引的映射中每个线程的递增计数如何?当它停止增加时,它就死了,是时候杀死和/或重新启动它了。该地图可以包含您管理所有这些以及在托管线程和那些讨厌的小孩之间共享信息所需的一切。

    【讨论】:

    • 我可以通过检查 Thread.IsAlive 或 Thread.ThreadState 属性来判断线程何时死亡。我遇到的问题是在线程死后检测线程中发生的事情,事后,来自另一个线程。
    • 听起来像是日志文件的工作。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多