代码之家  ›  专栏  ›  技术社区  ›  Ramzi Khahil

在System.ComponentModel上执行Dispose方法。组件发布事件回调?

c#
  •  0
  • Ramzi Khahil  · 技术社区  · 9 年前

    Timer

    public TimerViewModel(int interval) {
        m_timer = new Timer(interval);
        m_timer.Elapsed += timer_Elapsed;
        // Other stuff.
    }
    

    然后我有一个dispose方法,它处理我的类

    public void Dispose() {
        m_timer.Dispose();
        // Dispose some more stuff.
    }
    

    现在我想知道我是否应该注销我的回调 m_timer.Elapsed -= timer_Elapsed

    Timers 还有关于 Component ,但两者都只声明Dispose方法“释放组件使用的所有资源”,不管这意味着什么。

    那么 Timer.Dispose()

    1 回复  |  直到 9 年前
        1
  •  0
  •   Andreas Zita    9 年前

    我认为这是一种常见的做法,即注册处理程序的实例也会注销它(我很确定计时器不会在它的dispose方法中为您注销处理程序):

    public void Dispose() {
        m_timer.Elapsed -= timer_Elapsed;
        m_timer.Dispose();
    }
    

    但在你的情况下 TimerViewModel 显然拥有 m_timer 参考,我认为这没有那么重要,因为计时器实例的生存期将连接到您的 TimerViewModel公司

    如果计时器实例被传递到viewmodel中,或者以某种方式公开,以便其他对象也可以持有其引用,则会出现问题。在这种情况下,当您的viewmodel无法被垃圾收集时,您可能会导致内存泄漏,因为计时器无法被垃圾回收,因为另一个对象对它有引用等等。

    但不要让viewmodel IDisposable仅用于此目的。只要确保只有vm实例可以保存计时器实例引用,然后就可以忽略注销和处理计时器。除非您创建了很多这样的视图模型,并且确实需要始终保持较低的内存占用。当移除对viewmodel的引用时,它将被垃圾收集和处理。IDisposable主要用于当您需要确保一个组件在您告诉它时立即清理资源时,例如在一组图像中循环时,您确实需要在将另一个位图加载到内存之前释放一个位图。