使用.Net Framework 1.1,有哪些选项可用于监视来自其他线程的线程?我试图解决1.1中线程实现的缺点,其中未处理的异常将导致线程无声地死亡。在2.0及更高版本中,这已得到纠正,因此任何线程上的任何未处理的异常都将导致整个应用程序死亡,我相信。
当我的应用程序中的线程死亡时,我想从主线程中检索尽可能多的上下文:它们正在执行的方法,堆栈跟踪等。我可以确定它们何时死亡但是检索上下文已经证明是困难的。我已经尝试为AppDomain.CurrentDomain.UnhandledException
事件注册处理程序。但是当事件发生时我没有回电话。这可能是由于我正在开发的API的限制。
除了这个事件之外,还有哪些选项可以从线程获取上传到另一个线程时的上下文?
答案 0 :(得分:4)
你是如何创建这些线程的?您是否在线程池中添加了委托?如果是这样,您可以创建一个包装器方法,该方法接受所提供的委托并将其周围的另一个委托包装起来,它处理您的try / catch,然后将该新委托添加到线程池队列中。这样你就可以在第二个委托中输入你的错误处理代码。
答案 1 :(得分: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
答案 2 :(得分:0)
线程ID索引的映射中每个线程的递增计数怎么样?当它停止递增时,死亡和时间被杀死和/或重新启动它。地图可以包含管理所有这些以及在托管线程和那些讨厌的小孩之间共享信息所需的一切。
答案 3 :(得分: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.
}
}
}