我正在尝试为我们的Windows窗体应用程序实现一些性能检测,并且我想检测何时生成新线程(特别是从UI线程)并观察它何时退出。我知道我可以在
上捕获线程退出事件System.Windows.Forms.Application.ThreadExit
但我需要找出何时使用ThreadPool(或BackgroundWorker,它在引擎盖下使用ThreadPool)调用新线程。理想情况下,我也想让StackFrame从它调用。
任何人都知道这样做的方法吗? WMI也许?
感谢。
答案 0 :(得分:3)
向您的应用程序添加一个本机DLL,触发DllMain中DLL_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);
}