何时为传递给非托管代码的托管对象创建GCHandles?

时间:2018-07-06 00:44:35

标签: c# .net garbage-collection .net-internals

这是我阅读this StackOverflow question的答案时遇到的一个问题。何时将为托管对象创建的GCHandles确切地传递给非托管代码,以及何时释放这些句柄?

一个创建GCHandle的示例-在上面的链接中已提及,但我也用内存分析工具进行了验证-该示例位于以下System.Threading.Timer构造函数的重载所调用的方法之一内: / p>

public Timer(TimerCallback callback, object state, int dueTime, int period)

方法调用的途径之一是从上到下阅读:

System.Threading.Timers.TimerSetup
System.Threading.TimerBase.AddTimer
System.Threading.TimerBase.AddTimerNative

我从内存探查器中可以看到System.Threading.TimerBase.AddTimer方法创建了GCHandles,但是在该方法中我没有看到对GCHandle.Alloc的显式调用。 GCHandle在哪里创建?当调用导致非托管代码的方法(在这种情况下为System.Threading.TimerBase.AddTimerNative)时,.NET是否只是一种自动发生的事情?

0 个答案:

没有答案