每小时调用一个方法

时间:2014-09-22 18:16:06

标签: c# timer

我正在设置下载内容的小时数,并将其与当前时间进行比较以完成我的任务。例如,如果我将任务设置为48小时,那么我将其与当前时间进行比较并获得预期结果。在这种情况下,在完成48小时后,我正在调用另一种方法。

这是我的代码:

 if (_ScheduledTweetCount > 0 || DateTime.Now <= _ScheduledTweetHourTxtBox)
    {
        if (_ScheduledTweetCount > 0)
        {
            _ScheduledTweetCount--;
        }
        else
        {
            _ScheduledTweetHourTxtBox.CompareTo(scheduledTweetHourTxtBox);    
        }
        sw.Close();
        sw.Dispose();
    }
  CallingAnotherMethod();

enter image description here

我想要实现的是,而不是等待48小时来调用CallingAnotherMethod();方法,我想每小时调用一次,直到达到我预定的时间。我看到一些文章相关的计时器,但我不确定在这种情况下如何使用它。

3 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点。一种是使用从第一次调用时起每60分钟运行一次的计时器。第二种方法是创建一个在后台运行的计时器,每10秒左右调用一次,以检查是否已经过了一个小时(例如,如果时间从2.55变为3.10)。

60分钟计时器

myTimer = new System.Timers.Timer(60 * 60 * 1000); //one hour in milliseconds
myTimer.Elapsed += new ElapsedEventHandler(everyHour);
myTimer.Start();

事件处理程序方法:

private static void everyHour(object src, ElapsedEventArgs e)
{
   // Put the code you want repeated in here
}

检查时间是否按小时值更改

myTimer = new System.Timers.Timer(1000);   //One second, (less of an interval means that it will be more accurate, but more of an interval will mean that it uses less resources.  
int previousHour = DateTime.Now.Hour;
myTimer.Elapsed += new ElapsedEventHandler(everyHour);
myTimer.Start();

事件处理程序方法:

private static void everyHour(object src, ElapsedEventArgs e)
{
     if(previousHour < DateTime.Now.Hour || (previousHour == 23 && DateTime.Now.Hour == 0))
     {
           previousHour = DateTime.Now.Hour;
           YourMethod(); // Call The method with your important staff..
     }
}

答案 1 :(得分:0)

我发布了类似问题hree的答案,只是在这里重写代码,因为有些人可能不喜欢阅读没有代码行的答案:

using System;
using System.Threading.Tasks;

namespace COREserver{
    public static partial class COREtasks{   // partial to be able to split the same class in multiple files
        public static async void RunHourlyTasks(params Action[] tasks)
        {
            DateTime runHour = DateTime.Now.AddHours(1.0);
            TimeSpan ts = new TimeSpan(runHour.Hour, 0, 0);  // ensure minutes and seconds to be ZERO
            runHour = runHour.Date + ts;


            while (true)
            {
                TimeSpan duration = runHour.Subtract(DateTime.Now);
                if(duration.TotalMilliseconds <= 0.0)
                { 
                    Parallel.Invoke(tasks);
                    runHour = DateTime.Now.AddHours(1.0);
                    continue;
                }
                int delay = (int)(duration.TotalMilliseconds / 2);
                await Task.Delay(30000);  // 30 seconds
            }
        }
    }
}

答案 2 :(得分:-1)

将您的计时器间隔设置为30000(30秒)并将其设置为 你的计时器的代码打勾:

private void timer1_Tick(object sender, EventArgs e)
{
      if (DateTime.Now.Minute == 0)
      {
           // Do something
      }

}