都知道C#中垃圾是自动回收的,但是还是有需要注意的地方。垃圾回收有三个步骤:首先检查托管代码中引用的托管对象,然后尝试析构没有被析构的对象,最后垃圾回收器释放对象并回收内存。这其中有风险,那就是如果对象被非托管代码引用时(比如Win32 API、非托管DLL,或者使用COM的方法等),该对象有可能被错误的回收,这会导致程序运行错误。还有就是,垃圾回收这些事情都是系统单独线程来进行的,这样的话,如果一个对象在一个方法中产生,那么该对象在运行期间就有可能被回收。
上面两种问题都可以用KeepAlive()来解决,例如:
这个方法是告诉系统,ex这个对象不管怎么样也要给我保持到我调用KeepAlive()的地方。要不,这个方法退出后,系统会把ex回收掉,但是ex可能还正处于运行阶段。
上面两种问题都可以用KeepAlive()来解决,例如:
private static void SafeDoWork()
{
Example ex = new Example();
/…………
………………
………………/
GC.KeepAlive(ex);
}
这个方法是告诉系统,ex这个对象不管怎么样也要给我保持到我调用KeepAlive()的地方。要不,这个方法退出后,系统会把ex回收掉,但是ex可能还正处于运行阶段。