从ProcessThread到托管线程

时间:2009-11-17 15:13:25

标签: c# multithreading diagnostics

我们会定期关闭生产环境中无法重现的Windows服务。可能需要几个月才会再次发生。

我正在进行一些诊断尝试并帮助解决这个问题,我正在研究的一件事是在我们开始关闭应用程序后将事件添加到系统线程池60秒。我们的应用程序应在10秒内完全关闭。

在这种情况下,我想将事件的剩余运行线程追溯到事件日志。

我可以使用System.Diagnostics.Process.GetCurrentProcess.Threads获取正在运行的线程。这些线程对象具有本机Win32线程ID等。

我想知道是否有任何方法可以从这些线程ID返回到它们在当前进程中表示的任何托管线程。 我尝试这样做的原因是因为对于我们的线程池和其他线程,我们生成了代表其目的的名称,这将有助于将它们恢复。

2 个答案:

答案 0 :(得分:12)

由于以下原因,这是不可能的。 Quote from MSDN

  

操作系统ThreadId没有   与托管的固定关系   线程,因为非托管主机可以   控制之间的关系   托管和非托管线程。   具体而言,复杂的主机可以   使用CLR Hosting API来安排   许多托管线程反对同样的   操作系统线程,或移动一个   不同的托管线程   操作系统线程。

因此,托管线程和操作系统线程之间没有一对一的映射。

现在问题变成了,如何获取当前进程中当前运行的所有托管线程的列表?不幸的是我不知道答案。

答案 1 :(得分:0)

看起来这不可能。
幸运的是,我们有自己的线程库来包装.NET库,我能够提供功能来保存我们可以用于这些诊断的活动线程列表。
这项工作非常顺利,但当然还有相当多的努力和测试,但希望我们能够深入了解它。