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);
}
}
}