簡體   English   中英

計時器和垃圾收集

[英]Timers and Garbage Collection

說我有一堂這樣的課

class A
{
    private B _objB
    private Timer _timer; // Using System.Timers 

    public A(objB)
    {
        _objB = objB;
        _timer = new Timer();
        _timer.Interval = 1000;
        _timer.Elapsed += SomeEvent;
    }

    public void Begin()
    {
        _timer.start();
    }

    public void End()
    {
        _timer.Dispose();
    }

    public void SomeEvent (object sender, ElapsedEventArgs e)
    {
        if (_objB.Condition())
        {
            // do something
        }
        else 
        {
            _timer.Dispose();
        }
    }
}

現在在我的代碼中的其他地方,我這樣做了

public void SomeMethod(B objectB)
{
    A objA = new A(objectB);
    objA.Begin();
   // do other stuff
   // objA.End() can be called here but for this example it's not
}

我知道當我退出 SomeMethod() 的范圍時,objA 將不會被垃圾收集,因為有一個持續觸發的計時器事件。 我不確定的是以下幾點:

1) 在 SomeEvent 中,我遇到 else 條件並調用 _timer.Dispose(),這會停止觸發更多事件,但這會告訴 GC 它可以清理計時器和 objA 嗎? 換句話說,我是否導致任何內存泄漏?

2) 是否有任何可能導致異常的競爭條件? 因此,如果我正在調用 _timer.Dispose() 並以某種方式在隊列中有另一個計時器事件,那么進入該事件是否會導致任何異常?

我只是不確定我是否做了適量的清理以避免內存泄漏。

  1. 一般正確。 當您處置 Timer 時,ObjA 將有資格進行 GC。 事實上,垃圾收集器會在下一個垃圾收集周期收集它。

請記住,在符合 GC 條件后,它不會立即收集您的對象。 垃圾收集器使用其啟發式算法來觸發垃圾收集。 它僅在存在內存壓力時發生。 實際上當Gen0或Large Object Heap即將溢出時。

  1. 可能.. 看看這里

回調可以在調用 Dispose() 方法重載后發生,因為計時器將回調排隊以供線程池線程執行。 您可以使用 Dispose(WaitHandle) 方法重載等待所有回調完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM