我可能做了什么傻事,在这种情况下,我道歉。我正在使用System.Threading.Timer类,并使用state对象传递控制信息来设置开关计时器。一切都和我预期的一样,除了state对象直到程序退出时才最终确定。这个例子说明了我的意思。
class State
: IDisposable
{
public State()
{
Console.Out.WriteLine("State.State()");
}
~State()
{
Console.Out.WriteLine("State.~State()");
}
void IDisposable.Dispose()
{
Console.Out.WriteLine("State.Dispose()");
}
}
class Program
{
public static void Callback(object obj)
{
Console.Out.WriteLine("entering Callback()");
State state = (State)obj;
// . . . // do stuff
Console.Out.WriteLine("leaving Callback()");
}
public static void Main(string[] args)
{
Timer t = new Timer(Callback, new State(), 1000, Timeout.Infinite);
Thread.Sleep(5000);
t.Dispose();
t = null;
GC.Collect(10, GCCollectionMode.Forced); // prod GC to release "State"
Console.Out.WriteLine("leaving Main()");
}
}其输出结果为:
State.State()
entering Callback()
leaving Callback()
leaving Main()
State.~State()既然我设置了Timeout.Infinite时间来获取一个单次计时器,那么一旦计时器被分派,线程池是否应该释放它对状态对象的引用,而不是等到程序结束,如下所示。我担心这将是一个微妙的内存泄漏。
请给我开导一下。:-)
发布于 2009-10-05 22:54:32
在C#中,只有当对象被垃圾回收和销毁时,才会调用“finalize”或“deconstructor”。在此之前,该函数不会被调用。
在您的示例中,GC永远不需要运行,因为它是如此小的内存开销。
我想我说得不够具体,所以我不会概括正在发生的事情,而是向您指出MSDN文章解释了这种行为:
http://msdn.microsoft.com/en-us/library/system.object.finalize%28VS.71%29.aspx
当一个对象变得“不可访问”时(通过垃圾回收,尽管不能保证它何时会运行),或者当应用程序域关闭时,Finalize就会被调用。
https://stackoverflow.com/questions/1522820
复制相似问题