Existe-t-il un objet qui déclenchera un événement DateTime ou DateTimeOffset? J'utilise un minuteur pour faire cette opération maintenant mais cela demande un peu de calcul de ma part, je pensais juste qu'il y avait peut-être déjà quelque chose en place.Classe dans le BCL qui va se produire à un DateTime donné?
Répondre
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;
}
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
Ouais, je pense que c'est plus compliqué/hacky que juste en utilisant une minuterie et en calculant l'intervalle :) Belle pensée cependant. –
@ 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
Pas que je sache. J'ai roulé ma propre classe pour faire ça.
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();
}
c'est essentiellement ce que j'ai fini par faire. Merci! –