【发布时间】:2015-11-26 03:15:40
【问题描述】:
假设我有这样的课程
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() 并且以某种方式在队列中有另一个计时器事件,那么输入该事件会导致任何异常吗?
我只是不确定我是否进行了适量的清理以避免内存泄漏。
【问题讨论】:
标签: c# memory-management memory-leaks timer garbage-collection