【问题标题】:Is there a way to pause all Threading.Timer timers?有没有办法暂停所有 Threading.Timer 计时器?
【发布时间】:2012-05-29 15:10:08
【问题描述】:

我是 C# 新手,我正在开发一个需要多个计时器的程序。

我想知道当程序运行 CPU 密集型代码时,是否有办法同时暂停程序中的所有计时器?

目前,当前启用的计时器试图赶上密集操作期间引发的所有计时器事件。

【问题讨论】:

  • 我强烈建议编写一个代理类,它包装一个计时器并在内部有一个单一的滴答事件(它不会停止)但发布它自己的滴答事件,维护一个发布滴答的订阅者列表到。然后,您可以在外部事件处理程序上添加暂停/恢复更新的功能

标签: c# .net multithreading timer


【解决方案1】:

我认为您可以创建这些计时器的列表(当您激活它们时)并手动禁用这些计时器(使用Timer.Change 方法)。

【讨论】:

    【解决方案2】:

    您将需要跟踪您在列表中创建的所有计时器,并在您不希望它们运行时调用 change 方法。

      List<System.Threading.Timer> TimerList = new List<System.Threading.Timer>();
    
      Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250);
      Timer responseTimer = new Timer(tcb, autoEvent, 1000, 250);  
    
      TimerList.add(stateTimer);
      TimerList.add(responseTimer);
    
    foreach (System.Threading.Timer t in TimerList)
    {
      T.Change(TimeSpan(0), new(TimeSpan(0));
    }
    

    【讨论】:

      【解决方案3】:

      .NET 框架中无法获取所有正在运行的 Threading.Timer 实例的列表。但是您可以创建自己的 Timer 包装器,将所有正在运行的计时器添加到列表中,当然当计时器完成时将其删除。

      如果您只想确保您的方法仅在 CPU 空闲时执行,您可以将计时器的线程优先级设置为较低的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        相关资源
        最近更新 更多