检测.NET中生成的新线程

时间:2010-11-08 16:26:17

标签: .net winforms multithreading performance debugging

我正在尝试为我们的Windows窗体应用程序实现一些性能检测,并且我想检测何时生成新线程(特别是从UI线程)并观察它何时退出。我知道我可以在

上捕获线程退出事件
System.Windows.Forms.Application.ThreadExit 

但我需要找出何时使用ThreadPool(或BackgroundWorker,它在引擎盖下使用ThreadPool)调用新线程。理想情况下,我也想让StackFrame从它调用。

任何人都知道这样做的方法吗? WMI也许?

感谢。

5 个答案:

答案 0 :(得分:3)

向您的应用程序添加一个本机DLL,触发DllMainDLL_THREAD_ATTACH上所需的处理。

这是可靠地检测进程中所有线程创建的唯一方法。

编辑:这将是有问题的,因为托管线程和本机线程不对应1-1。我认为您可能必须利用托管线程调试支持来执行您想要的操作。痛苦但它应该工作。例如,请参阅ICorDebugThread

  

表示进程中的线程。该   ICorDebugThread的生命周期   实例与生命周期相同   它代表的线程。

ICorDebugProcess为您提供了一些有用的工具。

您真的不想编写调试器,但您确实希望对托管线程进行此级别的检查。母亲可能是ICorDebugManagedCallback::CreateThread

  

通知调试器一个线程   已经开始执行托管代码。

有相应的ExitThread回调。

答案 1 :(得分:1)

我想你可能会使用WMI temporary event consumer来查询,例如:

select * from __InstanceCreationEvent within 3 where
     TargetInstance ISA 'Win32_Thread'

然后给出该主题,您可以检查Process Handle并查看它是否是您的应用程序。

答案 2 :(得分:1)

我会去this way,如果我在你的鞋子里......

  

CLR Profiling API允许您挂钩托管函数,以便在输入函数时调用您的探查器,通过tailcall返回或退出。我们将这些称为Enter / Leave / Tailcall挂钩或“ELT”挂钩。在这个特别的多部分调查系列中,我将揭示ELT背后的真相。今天我将介绍一些基础知识,NGEN,以及我们称之为“慢路径”与“快速路径”的词汇。

然后,尝试创建方法过滤器,并捕获对Thread构造函数的调用。如果它可以工作,它可能是残酷的!

答案 3 :(得分:0)

这可能比您正在寻找的级别更高,但您可以使用Windows性能监视器来衡量多个与流程相关的指标,包括线程数。只需从“控制面板”中打开它即可管理工具|性能。然后为指标列表选择“处理”性能对象。

或者,如果您要维护此应用程序,则可以使用自己的挂钩来检测新线程的启动时间。

答案 4 :(得分:0)

这样的东西会起作用。我不得不把分裂('。')放进去,因为在调试模式下在visual studio中运行。

 var assy = Assembly.GetExecutingAssembly();
 var process = Process.GetProcesses().Where(a => assy.GetName().Name.Contains(a.ProcessName.Split('.')[0]));

        foreach (var p in process)
        {
            Console.WriteLine(p.Threads.Count);
        }