仅在每分钟的第 30 秒和第 0 秒调用方法c#

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


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 秒


慕仙森
浏览 222回答 3
3回答

喵喵时光机

使用计时器解决它的一种简单方法是将间隔设置为一秒,并在计时器的回调方法中检查值是否DateTime.Now.Seconds除以 30:void Timer_Elapsed(object sender, ElapsedEventArgs e){    if(DateTime.Now.Seconds % 30 == 0)    {        CalculateItems();    }}

哈士奇WWW

您最初可以以 1 秒的间隔启动计时器。然后在 Timer Event 中,如果 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();            }        }}

拉莫斯之舞

我用计时器解决了这个问题,并计算了下一个 30 秒块的时间:它在过去后再次重新计算 30 秒,否则每次运行后它会稍微得到一个增量。&nbsp;class Program&nbsp;{&nbsp; &nbsp; &nbsp;static System.Threading.Timer _ttimer;&nbsp; &nbsp; &nbsp;static void Main(string[] args)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetupTimerTo30sec();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.ReadLine();&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; private static void SetupTimerTo30sec()&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var now = DateTime.Now;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int diffMilliseconds;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (now.Second < 30)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;diffMilliseconds = (30 - now.Second) * 1000;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;diffMilliseconds = (60 - now.Second) * 1000;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;diffMilliseconds -= now.Millisecond;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (_ttimer != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ttimer.Change(diffMilliseconds, 30 * 1000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_ttimer = new Timer(OnElapsed, null, diffMilliseconds, 30 * 1000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;private static void OnElapsed(object state)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.Write(DateTime.Now.ToLongTimeString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine($":{DateTime.Now.Millisecond}");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetupTimerTo30sec();&nbsp; &nbsp; &nbsp;}&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP