【问题标题】:C# How to count managed threads in my AppDomain?C# 如何计算我的 AppDomain 中的托管线程?
【发布时间】:2010-06-18 10:25:51
【问题描述】:

有没有办法找出我使用了多少托管线程(包括 ThreadPool)?

当我通过 GetProcess 获得非托管线程的数量时,我得到了一个疯狂的数量(一开始是 21 个)

【问题讨论】:

    标签: c# .net multithreading threadpool


    【解决方案1】:

    这不是它的工作方式。托管程序中的任何线程都可以执行托管代码,包括最初作为非托管线程启动的代码。大多数是,主线程和任何线程池线程开始执行纯非托管代码。它通过 Marshal.GetDelegateForFunctionPointer() 提供的网关类型进入托管代码。

    看到几十个(否则不活动的)线程并不罕见。它们通常是线程池线程和由 COM 服务器启动的线程。 .NET 缺少在这些线程上使用 Thread.ManagedThreadId 所需的管道。这是有意的,逻辑 .NET 线程不必是物理操作系统线程。尽管当前使用的主机并非如此。

    你将不得不避免问这个问题。

    【讨论】:

    • 感谢您告诉我。但是我想得到一个答案。如何随时了解我的应用程序中创建了多少托管线程?
    • 这就是重点!我使用 3d 方 API,他们不想透露细节,也可能使用线程池或其他软件等......
    • 你只进入了悲伤五个阶段中的第二个阶段。在第 3 阶段,您可能会考虑解释为什么计数线程对您很重要。
    • 我需要它只是为了比较不同的版本和方法。最小化/优化线程数量并与 API 开发人员交流信息。所以这个问题不是很重要。 CAS很重要。不管你喜不喜欢,我都会切换它! :-P
    【解决方案2】:

    我没有检查是否可以使用调试接口,但是由于 VS 在其调试器中显示托管线程,您应该也可以在您的调试器中获取它们。

    在 .NET 中,编写调试器比您想象的要容易得多。实现调试器基本上包括实现ICorDebug 接口。

    有一个来自 Microsoft 的示例:Managed Debugger Sample

    【讨论】:

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