首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次性System.Threading.Timer状态在程序退出之前未完成

一次性System.Threading.Timer状态在程序退出之前未完成
EN

Stack Overflow用户
提问于 2009-10-05 22:51:18
回答 1查看 523关注 0票数 1

我可能做了什么傻事,在这种情况下,我道歉。我正在使用System.Threading.Timer类,并使用state对象传递控制信息来设置开关计时器。一切都和我预期的一样,除了state对象直到程序退出时才最终确定。这个例子说明了我的意思。

代码语言:javascript
复制
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()");
    }
}

其输出结果为:

代码语言:javascript
复制
State.State()
entering Callback()
leaving Callback()
leaving Main()
State.~State()

既然我设置了Timeout.Infinite时间来获取一个单次计时器,那么一旦计时器被分派,线程池是否应该释放它对状态对象的引用,而不是等到程序结束,如下所示。我担心这将是一个微妙的内存泄漏。

请给我开导一下。:-)

EN

回答 1

Stack Overflow用户

发布于 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就会被调用。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1522820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档