gpt4 book ai didi

c# - System.Timers.Timer 生命周期

转载 作者:行者123 更新时间:2023-11-30 15:08:58 27 4
gpt4 key购买 nike

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

double ms = 1000;
var t = new System.Timers.Timer(ms);
t.AutoReset = false;
t.Elapsed += (sender, e) => { runTask(); };
t.Start();

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

最佳答案

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

System.Timers.Timer 实现 IDisposable,这里的准则是,如果你有一个实现 IDisposable 的类,任何依赖于实现 IDisposable 的对象的类都应该实现 IDisposable 本身,并在它执行时调用对象 Dispose() 方法本身被调用。

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

public void Dispose()
{
this.timerBase.Dispose();
}

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

关于c# - System.Timers.Timer 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com