首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Timers.Timer生命周期

System.Timers.Timer生命周期
EN

Stack Overflow用户
提问于 2011-02-10 18:18:15
回答 2查看 3.9K关注 0票数 3

哪种方法是使用System.Timers.Timer的正确方法?我是说..。我创建了计时器,设置了间隔和要在经过的事件上调用的方法。

代码语言:javascript
复制
double ms = 1000;
var t = new System.Timers.Timer(ms);
t.AutoReset = false;
t.Elapsed += (sender, e) =>  { runTask(); }; 
t.Start();   

下一步呢?是否应该在计时器上处理调用?我想我不能,否则过去的事件永远不会发生。我是否应该在某个全局变量中注册计时器,以避免丢失对它的引用,这样GC就可以在调用Elapsed之前处理计时器?如果是这样,那么在处理了经过的事件之后(因此我的任务已经执行了),我该如何处理计时器呢?

EN

回答 2

Stack Overflow用户

发布于 2011-02-10 20:40:37

如果您在长时间运行的进程中使用计时器(例如,web应用程序或windows服务),如果您不想获得内存泄漏,如果您希望垃圾收集器能够回收为Timer对象分配的内存,则需要确保取消订阅计时器的已用事件处理程序。

System.Timers.Timer实现了IDisposable,这里的指导原则是,如果您有一个实现IDisposable的类,则任何依赖于实现IDisposable的对象的类都应该实现IDisposable本身,并在调用时调用对象Dispose()方法。

System.Timers.Timer就是一个很好的例子。这在幕后使用了System.Threading.Timer,如果查看反射器,可以看到System.Timers.Timer上Dispose方法的以下内容

代码语言:javascript
复制
public void Dispose()
{
    this.timerBase.Dispose();
}

在这里,timerBase只是System.Threading.Timer的一个实例,因此Dispose调用会级联到实现IDisposable的类的所有依赖项。

票数 4
EN

Stack Overflow用户

发布于 2011-02-10 18:22:59

您应该在表单/页面的关闭/卸载中或在您认为合适的任何位置调用t.Stop()。如果让它继续运行,它将不必要地使用资源,而且在关闭应用程序时可能会出现异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4955821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档