C# 使用Dispose停止调用计时器

C# 使用Dispose停止调用计时器,c#,timer,reference,null,dispose,C#,Timer,Reference,Null,Dispose,形势 我使用一个包含计时器对象的类每X秒调用一个方法。 此类(因为它是MVVM概念的一部分)与UserControl.XAML紧密相连 当用户“关闭”时,不再需要“MyClass”的UserControl类对象(包括计时器) 我假设timer对象将持续执行方法WriteLine(“15秒后调用”)unit垃圾收集器完成“MyClass”对象 为了避免这种情况,我当然可以手动实现Dispose方法来销毁计时器对象。(见示例) 这是正确的方法吗 (还有一个问题是是否需要设置pullTimer=nul

形势

我使用一个包含计时器对象的类每X秒调用一个方法。 此类(因为它是MVVM概念的一部分)与UserControl.XAML紧密相连

当用户“关闭”时,不再需要“MyClass”的UserControl类对象(包括计时器)

我假设timer对象将持续执行方法
WriteLine(“15秒后调用”)
unit垃圾收集器完成“MyClass”对象

为了避免这种情况,我当然可以手动实现Dispose方法来销毁计时器对象。(见示例)

这是正确的方法吗

(还有一个问题是是否需要设置
pullTimer=null

提前谢谢你

示例

class MyClass : IDisposable {
    private System.Timers.Timer pullTimer;

    public MyClass(){
        pullTimer = new System.Timers.Timer(15000);
        pullTimer.Elapsed += (s, o) => { System.Diagnostics.Debug.WriteLine("Called after 15 secs"); };
        pullTimer.Start();
    }

    public void Dispose() {
        // Disposing action
        if(pullTimer != null) {
            pullTimer.Dispose();
            // below required?
            pullTimer = null;
        }
    }
}

您应该调用计时器的
Stop()
方法,以防止计时器触发。

同意Andrew Morton和Alexander给出的答案。 此外,您还可以在不希望其运行的时间内禁用该时间。
TimerObject.Enable=false

您不想
有什么原因吗?停止()
计时器,让它在正常的流程中被处理掉?当然,停止()是一个选项。但实际上,我想更多地关注Dispose()的概念-正如您所看到的,
pullTimer
private
,因此不能从类外访问。当您使用System.Timers.Timer时,没有任何代码是正确的,您无法保证在调用Dispose()后不会运行经过的事件。或者它不会同时运行多次,则默认情况下AutoReset属性为true。或者,您会注意到在经过的事件处理程序中有一个异常,它们被吞没了。如果您想要可靠的代码,请不要使用它。@HansPassant谢谢您-但这不是主要主题-如果您感觉更好,请用定期任务替换
计时器;-)