【问题标题】:Viewing, pausing and killing threads in a running .Net application查看、暂停和终止正在运行的 .Net 应用程序中的线程
【发布时间】:2008-09-19 14:46:46
【问题描述】:

我正在开发一个 .Net 应用程序,它有多个线程来做各种事情。 当生产中出现问题时,我希望能够查看哪些线程正在运行(通过它们的托管名称)并且还能够暂停/终止它们。

无论如何要做到这一点?

VS 并不总是可用(虽然是一个不错的选择),而且 WinDbg UI 不适合 lite 的人。

我考虑过一个程序内线程窗口,就像 VS 在调试时那样,但找不到一种编程方式来做到这一点。 Process.GetThreads 返回的可用数据非常少。

【问题讨论】:

    标签: .net multithreading


    【解决方案1】:

    寻找话题:

    using System.Diagnostics;
    
    ProcessThreadCollection threads = Process.GetCurrentProcess().Threads;
    

    您通常可以使用 Thread.Abort() 终止托管线程。如果他们处于睡眠、等待或加入状态,您甚至可以使用(不那么讨厌的)Thread.Interrupt()。

    【讨论】:

    • 不幸的是,它返回一个ProcessThread的集合,它与System.Thread不一样;您提到的方法在 System.Thread 上。我不确定如何从 ProcessThread 到 System.Thread。 :-/
    【解决方案2】:

    .net 中没有任何内置功能可以做到这一点。如果您想以编程方式迭代您的活动线程,您必须在启动时在某处注册它们,并在完成时取消注册它们或在对它们采取行动之前对其进行过滤。我们做了一个版本,它需要大量的工作。

    【讨论】:

      【解决方案3】:

      您可以附加托管调试器来查看/冻结线程,或者如果您想要更轻量级的东西,可以使用带有 SOS 扩展的 WinDbg。

      【讨论】:

        【解决方案4】:

        远程调试呢?由于安全性和确保您拥有正确的调试符号,设置可能有点挑剔。

        Remote Debugging Setup

        【讨论】:

          【解决方案5】:

          您可以使用 ProcessExplorer 通过 id 和状态查看进程中正在运行的线程。

          http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

          使用“属性”窗口的“线程”选项卡。

          你也可以杀死线程并查看线程堆栈

          【讨论】:

          • 使用 Process Explorer 16.02,它不会在“线程”选项卡的列表中显示线程的名称。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-26
          • 1970-01-01
          相关资源
          最近更新 更多