代码之家  ›  专栏  ›  技术社区  ›  Jeff

检测.NET中生成的新线程

  •  0
  • Jeff  · 技术社区  · 15 年前

    我试图为Windows窗体应用程序实现一些性能测试工具,我想检测什么时候产生一个新线程(特别是从UI线程),并注意它何时退出。我知道我可以赶上线程退出事件

    System.Windows.Forms.Application.ThreadExit 
    

    但我需要找出何时使用ThreadPool(或BackgroundWorker,在hood下使用ThreadPool)调用新线程。理想情况下,我还希望获得调用StackFrame的位置。

    有人知道怎么做吗?可能是WMI?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Steve Townsend    15 年前

    将本机DLL添加到应用程序中,该应用程序在上触发所需的处理 DLL_THREAD_ATTACH 在里面 DllMain .

    编辑:这会有问题,因为托管线程和本机线程不对应1-1。我认为您可能必须利用托管线程调试支持来做您想要的事情。很痛苦,但应该管用。例如,请参见 ICorDebugThread .

    表示进程中的线程。这个 实例与生存期相同

    ICorDebugProcess 有一些有用的工具给你。

    ICorDebugManagedCallback::CreateThread .

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

    有一个对应的 ExitThread 回拨。

        2
  •  1
  •   stuartd saeed    15 年前

    WMI temporary event consumer

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

    然后给定线程,您可以检查进程句柄,看看它是否是您的应用程序。

        3
  •  1
  •   Daniel MoÅ¡mondor    15 年前

    我会去的 this way

    CLR剖析API允许您钩住托管函数,以便在输入、返回或退出TelCar时调用探查器。我们称之为进/出/尾钩或ELT钩。在这个特殊的多部分调查系列中,我将揭示英语教学背后的真相。今天我将写一些基础知识,NGEN,和一个词,关于我们所谓的“慢径”和“快径”。

    然后,尝试创建方法筛选器,并捕获对 Thread 构造函数。如果能成功,那就太残忍了!

        4
  •  0
  •   Justin Ethier    15 年前

    或者,如果您正在维护这个应用程序,您可以将自己的钩子放在适当的位置,以检测新线程何时启动。

        5
  •  0
  •   KenL    15 年前

     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);
            }