从ProcessThread获取托管线程

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

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

在这种情况下,我想跟踪流程的剩余运行线程到事件日志。

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

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

由于以下原因,这是不可能的。 从MSDN引用 :

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

因此,托管线程和OS线程之间没有一对一的映射。

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

它看起来不可能。
幸运的是,我们有自己的线程库来包装.NET库,我能够提供function来保存我们可以用于这些诊断的活动线程列表。
这样做效果很好但是当然还有相当多的努力和测试,但希望我们能够得到它的底部。