Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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
C# .Net评测-了解托管线程的开始和结束_C#_.net_Profiling_Clr_Clr Profiling Api - Fatal编程技术网

C# .Net评测-了解托管线程的开始和结束

C# .Net评测-了解托管线程的开始和结束,c#,.net,profiling,clr,clr-profiling-api,C#,.net,Profiling,Clr,Clr Profiling Api,我正在开发一个.Net分析器。。我用ILRewriting来写这个 我需要跟踪托管线程的创建和销毁 需要知道在线程开始时和线程结束时将调用的线程相关函数,我可以向其注入代码,并在事件发生时进行记录 关于在线程创建和结束时调用的默认函数有什么想法吗 或者,是否有其他方法可以捕获托管线程创建和销毁事件 我知道我们可以通过设置线程事件掩码进行跟踪。。但是我需要捕获特定的托管线程,而不是所有线程。正如Hans指出的,CLR使用和回调通知探查器线程的创建/销毁。注意:如果运行时在线程终止之前关闭,那么您将

我正在开发一个.Net分析器。。我用ILRewriting来写这个

我需要跟踪托管线程的创建和销毁

需要知道在线程开始时和线程结束时将调用的线程相关函数,我可以向其注入代码,并在事件发生时进行记录

关于在线程创建和结束时调用的默认函数有什么想法吗

或者,是否有其他方法可以捕获托管线程创建和销毁事件


我知道我们可以通过设置线程事件掩码进行跟踪。。但是我需要捕获特定的托管线程,而不是所有线程。

正如Hans指出的,CLR使用和回调通知探查器线程的创建/销毁。注意:如果运行时在线程终止之前关闭,那么您将不会得到ThreadDestroyed回调。。。但是我认为,您没有得到ThreadDestroyed回调的更可能的原因是IIS(我假设通过“页面加载”您指的是asp.NET页面)决定保留线程以备将来的请求,作为一种优化,如果它认为有足够的其他线程,它可能会决定稍后终止它

另外,关于您对该问题的第二个评论,ThreadID和。我认为ThreadID是对内部数据结构的引用(将其视为不透明值,不要试图解释它),ManagedThreadID似乎是线程首先进入托管代码时按顺序分配的一个简单数字。如果要确定哪个ThreadID对应哪个托管线程,我可以考虑3个选项:

  • 使用回调检查线程名称(注意:如果线程名称是在线程启动之前设置的,那么这将在ThreadCreated回调之前引发)
  • 使用回调函数检查操作系统线程id
  • 将已分析的代码调用放入探查器中,为其提供上下文(使用pinvoke或通过调用为此目的检测的方法)

您不需要使用IL重写来编写分析器。您可以使用CLR的内置支持进行分析。ICorProfilerCallback::ThreadCreated()和ThreadDestroyed告诉您需要什么。。但是主线程(从页面加载开始)即使在页面加载完成后(即调用
unloadrecursive
后)也不会被破坏。。我不知道有什么问题。还有一件事。。据我所知,
ThreadID
在profiler dll中的
ThreadCreated
函数是一个ManagedThreadID。。但是对于同一个线程,如果我在C代码中得到ManagedThreadID,则它是另一个数字,例如10或11。使用
CurrentThread.ManagedThreadID
。那么这里哪个是managedthread id??我完全糊涂了。。