C# 使用Dispose停止调用计时器
形势 我使用一个包含计时器对象的类每X秒调用一个方法。 此类(因为它是MVVM概念的一部分)与UserControl.XAML紧密相连 当用户“关闭”时,不再需要“MyClass”的UserControl类对象(包括计时器) 我假设timer对象将持续执行方法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
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谢谢您-但这不是主要主题-如果您感觉更好,请用定期任务替换计时器;-)