为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕仙森 2022-06-18 17:16:09
我有一种方法可以进行一些计算。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.Timervar timer = new System.Threading.Timer(            e => CalculateItems(),            null,            TimeSpan.Zero,            TimeSpan.FromSeconds(30));但它每 30 秒命中一次我的方法而不是每分钟的第 30 秒
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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


void Timer_Elapsed(object sender, ElapsedEventArgs e)

{

    if(DateTime.Now.Seconds % 30 == 0)

    {

        CalculateItems();

    }

}


查看完整回答
反对 回复 2022-06-18
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您最初可以以 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();

            }

        }

}


查看完整回答
反对 回复 2022-06-18
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

我用计时器解决了这个问题,并计算了下一个 30 秒块的时间:它在过去后再次重新计算 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();

     }

 }


查看完整回答
反对 回复 2022-06-18
  • 3 回答
  • 0 关注
  • 221 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号