using System; using System.Diagnostics; namespace Developpez.Dotnet.Diagnostics { /// /// Permet de chronométrer un traitement effectué dans un bloc using. /// public class AutoStopwatch : IDisposable { private Stopwatch _stopwatch; private Action _action; /// /// Initialise une nouvelle instance de AutoStopwatch /// public AutoStopwatch() { _stopwatch = Stopwatch.StartNew(); } /// /// Initialise une nouvelle instance de AutoStopwatch /// en spécifiant l'action à effectuer quand le traitement se termine /// /// Action a exécuter quand le traitement est terminé (prend en paramètre le temps écoulé) public AutoStopwatch(Action action) { _action = action; _stopwatch = Stopwatch.StartNew(); } /// /// Renvoie le temps écoulé depuis le début du traitement /// public TimeSpan Elapsed { get { return _stopwatch.Elapsed; } } /// /// Renvoie le nombre de millisecondes écoulées depuis le début du traitement /// public long ElapsedMilliseconds { get { return _stopwatch.ElapsedMilliseconds; } } /// /// Renvoie le nombre de ticks écoulés depuis le début du traitement /// public long ElapsedTicks { get { return _stopwatch.ElapsedTicks; } } /// /// Arrête le chronomètre. /// public void Stop() { if (_stopwatch.IsRunning) _stopwatch.Stop(); } #region IDisposable Members /// /// Libère les ressources utilisées par l'objet et appelle l'action de fin de traitement. /// void IDisposable.Dispose() { Stop(); if (_action != null) { var tmp = _action; _action = null; tmp(_stopwatch.Elapsed); } } #endregion /// /// Démarre une nouvelle AutoStopwatch avec l'action indiquée /// /// Action a exécuter quand le traitement est terminé (prend en paramètre le temps écoulé) /// Une nouvelle instance de AutoStopwatch public static AutoStopwatch StartNew(Action action) { return new AutoStopwatch(action); } } }