仅在每分钟30秒和0秒的C#中调用方法

时间:2018-12-19 07:14:09

标签: c# timer

我有一种方法可以进行一些计算。

public void CalculateItems()
{
// Calculate the empty Items
}

我需要每分钟 30秒执行一次。

如果我的服务从10:00:15开始,则该方法应从 10:00:30、10:01:00、10:01:30 开始工作,然后继续。

>

如果我的服务在10:00:50开始,则该方法应从 10:01:00、10:01:30、10:02:00 开始工作,然后继续。 我已经尝试过System.Threading.Timer, System.Timers.Timer,但在所有这些情况下,我都无法实现自己的方案。请帮助您提出宝贵的建议。

我尝试过的是在System.Threading.Timer中

var timer = new System.Threading.Timer(
            e => CalculateItems(),
            null,
            TimeSpan.Zero,
            TimeSpan.FromSeconds(30));

但是它达到了我的方法,每30秒,而不是每分钟 30秒

3 个答案:

答案 0 :(得分:2)

使用计时器解决此问题的一种简单方法是将间隔设置为一秒,然后在计时器的回调方法中检查DateTime.Now.Seconds的值是否除以30:

void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    if(DateTime.Now.Seconds % 30 == 0)
    {
        CalculateItems();
    }
}

答案 1 :(得分:1)

您可以最初以1秒的间隔启动计时器。然后,在计时器事件中,如果DateTime.Now.Second为30或0,则可以将间隔设置为30秒。从那时起,您的事件只会在指定的时间触发。

System.Timers.Timer timer= new System.Timers.Timer(1000);

private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
       if(timer.Interval!=30000 && DateTime.Now.Seconds % 30 == 0)
       {
            timer.Stop();
            timer.Interval = 30000;
            timer.Start();
            DoWork();
       }
       else
       {
        if(timer.Interval==30000)
            {
                DoWork();
            }
        }
}

答案 2 :(得分:0)

我用计时器解决了这个问题,并计算了下30秒的Sime: 经过30秒后,它将重新计算,否则每次运行后都会稍微增加一个增量。

 class Program
 {
     static System.Threading.Timer _ttimer;

     static void Main(string[] args)
     {

         SetupTimerTo30sec();
         Console.ReadLine();
     }

    private static void SetupTimerTo30sec()
     {
         var now = DateTime.Now;
         int diffMilliseconds;
         if (now.Second < 30)
         {
             diffMilliseconds = (30 - now.Second) * 1000;
         }
         else
         {
             diffMilliseconds = (60 - now.Second) * 1000;
         }
         diffMilliseconds -= now.Millisecond;

         if (_ttimer != null)
         {
             _ttimer.Change(diffMilliseconds, 30 * 1000);
         }
         else
         {
             _ttimer = new Timer(OnElapsed, null, diffMilliseconds, 30 * 1000);
         }
     }

     private static void OnElapsed(object state)
     {
         Console.Write(DateTime.Now.ToLongTimeString());
         Console.WriteLine($":{DateTime.Now.Millisecond}");
         SetupTimerTo30sec();
     }
 }