Est-il une raison d'une Minuterie aurait AutoReset faux, mais puis re-démarrer lui-même lors de son événement écoulée?
Je viens de tombé sur ce code et je ne la comprends pas. Est-il une raison pour utiliser cette conception au lieu de simplement exécuter à nouveau le temps écoulé code avec AutoReset vrai?
private readonly Timer Timer = new Timer();
protected override void OnStart(string[] args)
{
Logger.InfoFormat("Starting {0}.", ServiceName);
try
{
// If Enabled is set to true and AutoReset is set to false, the Timer raises the Elapsed event only once, the first time the interval elapses.
Timer.AutoReset = false;
Timer.Elapsed += Timer_Elapsed;
Timer.Interval = Settings.Default.ScriptingStatusLifeTime;
Timer.Start();
}
catch (Exception exception)
{
Logger.ErrorFormat("An error has occurred while starting {0}.", ServiceName);
Logger.Error(exception);
throw;
}
}
///<summary>
///Whenever the Schedule Service time elapses - go to the ScriptingStatus table
///and delete everything created earlier than 1 hour ago (by default, read from ScriptingStatusLifeTime)
///</summary>
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
// ScriptingStatusLifeTime defaults to 60 minutes.
DateTime deleteUntil = DateTime.Now.AddMilliseconds(Settings.Default.ScriptingStatusLifeTime * -1);
Logger.InfoFormat("Clearing all ScriptingStatus entries with ControlDate before: {0}.", deleteUntil);
RemoteActivator.Create<RemoteScriptingStatus>().DeleteUntil(deleteUntil);
}
catch (Exception exception)
{
Logger.Error(exception);
}
finally
{
Timer.Start();
}
}
De plus, je suis à la recherche d'un memoryleak dans le présent code.
Je viens de lire ce post: Si l'autoreset est définie sur false, mon timer être éliminés automatiquement? qui semble impliquer que mon objet Timer doit être éliminé correctement. Je ne vois pas tous les appels à Disposer dans le fichier courant. Je me demandais si ce Timer_Elapsed événement est également l'introduction d'une fuite?
OriginalL'auteur Sean Anderson | 2013-10-01
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien, en ayant
AutoReset
à true, l'événement timer de feu peuvent se chevaucher où le temps de l'événement est à exécuter va au-delà de la valeur de délai d'expiration.Par exemple, le délai d'attente de 10 secondes, mais une charge de travail de 1 minute.
Cependant avec
AutoReset
comme fausse, alors l'événement de minuterie se déclenche uniquement une fois. Vous pouvez redémarrer le chronomètre lors de votre événement et la minuterie peut continuer.Dans l'exemple, cela signifie que la minuterie peut mettre le feu au bout de 10 secondes, mais si l'événement prend plus de 10 secondes, il n'y a pas de chevauchement, il suffit de re-démarrer après le travail est terminé.
C'est à peu près comment je le fais et aussi la façon dont vous l'avez dans votre exemple de code.
Addendum: ci-dessus n'est vrai que si vous ne définissez pas de synchronisation de l'objet, c'est parce que le temps écoulé événement est déclenché sur le pool de threads. Si vous définissez une synchronisation de l'objet, puis je m'attends à de verrouillage pour bloquer l'écoulement de l'événement, de sorte qu'un seul événement peut mettre le feu à la fois.
OriginalL'auteur Lloyd