每小时执行一次方法

Roc*_*Gom 10 c# timer

我想每小时执行一个方法.我写了一些代码,但这还不足以实现我的目标.下面的代码每60分钟工作一次.

public void Start()
{
    System.Threading.Timer timerTemaUserBilgileri = new System.Threading.Timer(new System.Threading.TimerCallback(RunTakip), null, tmrTemaUserBilgileri, 0);
}

public void RunTakip(object temauserID)
{
    try 
    {
        string objID = "6143566557387";
        EssentialMethod(objID);
        TimeSpan span = DateTime.Now.Subtract(lastRunTime);
        if (span.Minutes > 60)
        {
            tmrTemaUserBilgileri = 1 * 1000;
            timerTemaUserBilgileri.Change(tmrTemaUserBilgileri, 0);
        }
        else
        {
            tmrTemaUserBilgileri = (60 - span.Minutes) * 60 * 1000;
            timerTemaUserBilgileri.Change(tmrTemaUserBilgileri, 0);
        }
        watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;
    }
    catch (Exception ex)
    {
        timerTemaUserBilgileri.Change(30 * 60 * 1000, 0);
        Utils.LogYaz(ex.Message.ToString());
    }
}

public void EssentialMethod(objec obj)
{
    //some code
    lastRunTime = DateTime.Now;
    //send lastruntime to sql 
}
Run Code Online (Sandbox Code Playgroud)

Ana*_*ion 21

如果您希望每60分钟执行一次代码:

aTimer = new System.Timers.Timer(60 * 60 * 1000); //one hour in milliseconds
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Start();
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    //Do the stuff you want to be done every hour;
}
Run Code Online (Sandbox Code Playgroud)

如果你想让你的代码每小时执行一次(即1:00,2:00,3:00),你可以创建一个小间隔的计时器(让我们说一秒钟,取决于你需要的精度)和里面的计时器事件检查是否已经过了一个小时

aTimer = new System.Timers.Timer(1000); //One second, (use less to add precision, use more to consume less processor time
int lastHour = DateTime.Now.Hour;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Start();
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    if(lastHour < DateTime.Now.Hour || (lastHour == 23 && DateTime.Now.Hour == 0))
     {
           lastHour = DateTime.Now.Hour;
           YourImportantMethod(); // Call The method with your important staff..
     }

}
Run Code Online (Sandbox Code Playgroud)


小智 6

我同意塞纳·索尔特(SeñorSalt)的观点,计时工作应该是第一选择。但是,OP要求从c#开始每小时获取每小时。为此,我将第一个定时事件设置为按小时触发:

int MilliSecondsLeftTilTheHour()
{
    int interval;

    int minutesRemaining = 59 - DateTime.Now.Minute;
    int secondsRemaining = 59 - DateTime.Now.Second;
    interval = ((minutesRemaining * 60) + secondsRemaining) * 1000;

    // If we happen to be exactly on the hour...
    if (interval == 0)
    {
        interval = 60 * 60 * 1000;
    }
    return interval;
}

Timer timer = new Timer();
timer.Tick += timer_Tick;
timer.Enabled = true;
timer.Interval = MilliSecondsLeftTilTheHour();
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果上述timer.Interval恰好是45分32秒,那么该计时器将继续每45:32触发一次,而不仅仅是第一次。因此,在timer_Tick方法内部,您必须将timer.Interval重新调整为一小时。

 void timer_Tick(object sender, EventArgs e)
 {
     // The Interval could be hard wired here to  60 * 60 * 1000 but on clock 
     // resets and if the job ever goes longer than an hour, why not
     // recalculate once an hour to get back on track.
     timer.Interval = MilliSecondsLeftTilTheHour();
     DoYourThing();
 }
Run Code Online (Sandbox Code Playgroud)


Pau*_*son 5

只是基于/ Anarion的解决方案的一个小评论,我无法评论.

你可以创建一个小间隔的计时器(让我们说一秒钟,取决于你需要的精度)

你根本不需要任何精确度,你在想"如何检查这个小时是我要开火的时间".你也可以选择"如何检查下一个小时是我想要开火的时间" - 一旦你认为你完全不需要任何精确度,只需每小时一次,然后设置一个线程.下个小时.如果你每小时打一次,你知道你会在下一个小时之前到达某个地方.

Dim dueTime As New DateTime(Date.Today.Year, Date.Today.Month, Date.Today.Day, DateTime.Now.Hour + 1, 0, 0)
Dim timeRemaining As TimeSpan = dueTime.Subtract(DateTime.Now)

t = New System.Threading.Timer(New System.Threading.TimerCallback(AddressOf Method), Nothing, CType(timeRemaining.TotalMilliseconds, Integer), System.Threading.Timeout.Infinite)
Run Code Online (Sandbox Code Playgroud)