【问题标题】:Execute an operation every x seconds for y minutes in c#在c#中每x秒执行一次操作y分钟
【发布时间】:2009-04-24 16:42:58
【问题描述】:

我需要每 5 秒运行一次函数,持续 10 分钟。

我使用计时器运行 5 秒,但如何将计时器限制为仅 10 分钟?

【问题讨论】:

    标签: c# timer


    【解决方案1】:

    只需在 elapsed 处理程序中捕获您想要停止的时间并结束您的计时器。这是一个示例(注意:我使用了System.Threading.Timertimer。为您正在做的事情选择适当的计时器。例如,如果您在 Winforms 中编写,您可能会在 System.Windows.Forms.Timer 之后。)

    public class MyClass
    {
        System.Threading.Timer Timer;
        System.DateTime StopTime;
        public void Run()
        {
            StopTime = System.DateTime.Now.AddMinutes(10);
            Timer = new System.Threading.Timer(TimerCallback, null, 0, 5000);
        }
    
        private void TimerCallback(object state)
        {
            if(System.DateTime.Now >= StopTime)
            {
                Timer.Dispose();
                return;
            }
            // Do your work...
        }
    }
    

    【讨论】:

      【解决方案2】:

      让你的计时器循环如下:

      DateTime endTime = DateTime.Now.AddMinutes(10);
      
      while(endTime < DateTime.Now)
      {
        // Process loop
      }
      

      【讨论】:

      • 我宁愿存储 结束时间 并将其与每次迭代之前的当前时间值进行比较。尽管如此,+1。
      【解决方案3】:

      将 Y 分钟除以 X 间隔,得到它需要运行的次数。之后你只需要计算函数被调用了多少次。

      在您的情况下,需要 10 分钟 = 600 秒 / 5 秒 = 120 次调用。只需让计数器记录您的函数被调用的次数。

      【讨论】:

        【解决方案4】:

        Timer.Stop() 在 120 个滴答声之后。

        【讨论】:

        • 对简单答案的否定? :)
        【解决方案5】:

        只需使用 DateTime 变量来跟踪它应该何时结束并在开始之前设置它。在您的 Elapsed 事件处理程序上,检查信号时间是否小于结束时间。如果不是,请停止计时器。

        【讨论】:

          【解决方案6】:

          您可以计算您的函数将被调用的次数,并创建递减计数器,在您取消订阅计时器滴答之后。或者您可以运行另一个具有滴答周期的计时器 - 10 分钟,然后在滴答时取消订阅计时器滴答调用您的函数。

          【讨论】:

            【解决方案7】:

            注意开始时间。在每次通话中,测试 currentTime + 5 秒 > startTime + 10 分钟。如果是这样,请禁用计时器。

            我更喜欢这种只运行 N 个滴答声的方法,因为定时器不能保证在您希望它们触发时触发。 120 个滴答声可能会运行 10 分钟的真实世界时间。

            【讨论】:

              【解决方案8】:

              您可以设置两个计时器,一个运行 5 秒,另一个运行 10 分钟,然后禁用第一个

              【讨论】:

                【解决方案9】:

                您可以使用第二个计时器:

                class Program
                {
                    static void Main(string[] args)
                    {
                        int interval = 5 * 1000; //milliseconds
                        int duration = 10 * 60 * 1000; //milliseconds
                
                        intervalTimer = new System.Timers.Timer(interval);
                        durationTimer = new System.Timers.Timer(duration);
                
                        intervalTimer.Elapsed += new System.Timers.ElapsedEventHandler(intervalTimer_Elapsed);
                        durationTimer.Elapsed += new System.Timers.ElapsedEventHandler(durationTimer_Elapsed);
                
                        intervalTimer.Start();
                        durationTimer.Start();
                    }
                
                    static void durationTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
                    {
                        intervalTimer.Stop();
                        durationTimer.Stop();
                    }
                
                    static void intervalTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
                    {
                        //call your method
                    }
                
                    private static System.Timers.Timer intervalTimer;
                    private static System.Timers.Timer durationTimer;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-01-10
                  • 1970-01-01
                  • 2013-01-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多