【问题标题】:Best way to disable a System.Threading.Timer禁用 System.Threading.Timer 的最佳方法
【发布时间】:2013-08-14 04:24:11
【问题描述】:

我有一个System.Threading.Timer,可以打开和关闭。我知道关闭计时器的两种方法:

  1. 致电Timer.Change(-1,-1)
  2. 释放计时器,并在需要时创建一个新的

在资源和性能方面哪个更好?打电话给Change(-1,-1) 是 CPU 加热器吗?创建计时器是否昂贵?

【问题讨论】:

标签: .net timer


【解决方案1】:

将计时器的到期时间和周期设置为无限以暂时停止操作。

MyTimer.Change(Timeout.Infinite, Timeout.Infinite);

要恢复将其更改回正常操作间隔:

MyTimer.Change(this.RestartTimeout, this.OperationInterval);

不需要每次都dispose和recreate,将interval设置为infinite不会浪费和额外的cpu周期。

在这个例子中,值this.RestartTimeout表示在恢复后到计时器的第一个“tick”运行多长时间,我通常使用0。

在我的具体使用中,我一般是切换定时器的到期时间和周期,然后停止定时器作为它回调的第一行,做定时器工作,最后再恢复。这是为了防止长时间运行的代码重入。

(Timeout.Infite is -1)

【讨论】:

  • 我更喜欢这个答案,因为它使用常量 (Timeout.Infinite) 而不是魔法值。
【解决方案2】:

将计时器的初始值和间隔设置为 -1(即Change(-1, -1))不是“CPU 加热器”。计时器不使用 CPU 资源。回调方法当然可以,但仅限于(通常是短暂的)执行期间。

在任何情况下,创建一个新计时器一点都不昂贵,使用Change(-1, -1) 禁用它也不会对性能产生任何负面影响。使用最适合您的模型的技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2019-01-04
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2020-11-02
    相关资源
    最近更新 更多