[英]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() 並以某種方式在隊列中有另一個計時器事件,那么進入該事件是否會導致任何異常?
我只是不確定我是否做了適量的清理以避免內存泄漏。
請記住,在符合 GC 條件后,它不會立即收集您的對象。 垃圾收集器使用其啟發式算法來觸發垃圾收集。 它僅在存在內存壓力時發生。 實際上當Gen0或Large Object Heap即將溢出時。
回調可以在調用 Dispose() 方法重載后發生,因為計時器將回調排隊以供線程池線程執行。 您可以使用 Dispose(WaitHandle) 方法重載等待所有回調完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.