2009-03-22 11 views

Répondre

2

Je ne vois pas comment vous devez faire un calcul:

public void StartTimer(DateTime target) { 
    double msec = (target - DateTime.Now).TotalMilliseconds; 
    if (msec <= 0 || msec > int.MaxValue) throw new ArgumentOutOfRangeException(); 
    timer1.Interval = (int)msec; 
    timer1.Enabled = true; 
} 
+0

c'est essentiellement ce que j'ai fini par faire. Merci! –

0

Si vous utilisez ASP.NET, vous pouvez ajouter un objet vide dans le cache avec un ExpirationDate déclaré, puis gérer le CacheItemRemovedCallback. Juste une pensée, je ne sais pas si cela va marcher pour vous.

Si vous ne l'utilisez ASP.NET vous pouvez toujours être en mesure d'utiliser cette astuce avec un autre cadre de la mise en cache comme le Enterprise Library Caching Block

+0

Ouais, je pense que c'est plus compliqué/hacky que juste en utilisant une minuterie et en calculant l'intervalle :) Belle pensée cependant. –

+0

@ spoon16, d'accord, ce n'est pas une technique que j'ai jamais utilisé, ou nécessaire, mais j'en ai entendu parler quelque part. – bendewey

0

Pas que je sache. J'ai roulé ma propre classe pour faire ça.

1

J'aime:

System.Timers.Timer _WaitForScheduledTime; 
_WaitForScheduledTime = new System.Timers.Timer(); 
_WaitForScheduledTime.Elapsed += new ElapsedEventHandler(WaitForScheduledTime_OnElapsed); 
_WaitForScheduledTime.Interval = _ListOfJobs.IntervalUntilFirstJobIsToRun().TotalMilliseconds; 
_WaitForScheduledTime.Start(); 

...

private void WaitForScheduledTime_OnElapsed(object source, EventArgs e) 
{ 
    log.Debug("Ready to run at least one job"); 

    // restart the timer 
    _WaitForScheduledTime.Interval = _ListOfJobs.IntervalUntilFirstJobIsToRun().TotalMilliseconds; 
    _WaitForScheduledTime.Start(); 
}