Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测在.NET中生成的新线程_.net_Winforms_Multithreading_Performance_Debugging - Fatal编程技术网

检测在.NET中生成的新线程

检测在.NET中生成的新线程,.net,winforms,multithreading,performance,debugging,.net,Winforms,Multithreading,Performance,Debugging,我正在尝试为我们的Windows窗体应用程序实现一些性能检测,我想检测何时产生新线程(特别是从UI线程),并观察它何时退出。我知道我可以捕获上的线程退出事件 System.Windows.Forms.Application.ThreadExit 但我需要知道何时使用ThreadPool(或BackgroundWorker,它在后台使用ThreadPool)调用新线程。理想情况下,我还希望得到调用它的StackFrame 有人知道这样做的方法吗?也许吧 谢谢。这可能比您想要的级别更高,但您可以

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

System.Windows.Forms.Application.ThreadExit 
但我需要知道何时使用ThreadPool(或BackgroundWorker,它在后台使用ThreadPool)调用新线程。理想情况下,我还希望得到调用它的StackFrame

有人知道这样做的方法吗?也许吧


谢谢。

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


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

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


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

我想您可能可以使用,并使用如下查询:

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

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

我想您可能可以使用一个,带有如下查询:

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

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

类似的操作将起作用。由于在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);
        }

像这样的东西会有用的。由于在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);
        }

将本机DLL添加到应用程序中,以触发中的
DLL\u THREAD\u ATTACH
上所需的处理

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

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

表示进程中的线程。这个 ICORDEBUG线程的生存期 实例与生存期相同 它所代表的线程的类型

还有一些有用的工具

您并不是真的想编写调试器,但确实希望对托管线程进行这种级别的检查。母矿脉可能是

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


有一个相应的
ExitThread
回调。

向应用程序中添加一个本机DLL,该DLL在中的
DLL\u THREAD\u ATTACH
上触发所需的处理

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

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

表示进程中的线程。这个 ICORDEBUG线程的生存期 实例与生存期相同 它所代表的线程的类型

还有一些有用的工具

您并不是真的想编写调试器,但确实希望对托管线程进行这种级别的检查。母矿脉可能是

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

有一个相应的
ExitThread
回调。

如果我处在你的位置,我会去的

CLR分析API允许您钩住托管函数,以便在通过tailcall输入、返回或退出函数时调用您的分析程序。我们将其称为进入/离开/尾随调用挂钩或“ELT”挂钩。在这个由多部分组成的特别调查系列中,我将揭示英语教学背后的真相。今天我将介绍一些基本知识,NGEN,以及一个我们称之为“慢路径”与“快路径”的词

然后,尝试创建方法过滤器,并捕获对
Thread
构造函数的调用。如果它能起作用,那就太残忍了

如果我处在你的位置,我会去的

CLR分析API允许您钩住托管函数,以便在通过tailcall输入、返回或退出函数时调用您的分析程序。我们将其称为进入/离开/尾随调用挂钩或“ELT”挂钩。在这个由多部分组成的特别调查系列中,我将揭示英语教学背后的真相。今天我将介绍一些基本知识,NGEN,以及一个我们称之为“慢路径”与“快路径”的词


然后,尝试创建方法过滤器,并捕获对
Thread
构造函数的调用。如果它能起作用,那就太残忍了

的确,我们在维护它,但我想避免在每个位置添加钩子,一个新线程在我们想要跟踪的地方生成(~400k行代码)。确实,我们在维护它,但我想避免在每个位置添加钩子,一个新线程在我们想要跟踪的地方生成(~400k行代码)。您有没有办法将其与.NET线程对象关联?对于没有事件提供程序的事件查询,INTERNAIN子句是必需的(如果省略,则会引发错误)。间隔是必须传递事件通知之前可以经过的最长时间(以秒为单位)。@JeffN825:它甚至可能不是.NET线程,在这种情况下,没有关联的.NET线程对象。您有没有办法将其关联到.NET线程对象?INTERNAIN子句对于事件查询是必需的