Stopwatch class from .net 2.0 framework ported .net 1.1
Here is the handy Stopwatch class from .net 2.0 framework back ported .net 1.1. Enjoy…
/// <summary>Provides a set of methods and properties that you can use to accurately measure elapsed time.</summary> public class Stopwatch { #region SafeNativeMethods [DllImport("kernel32.dll")] private static extern bool QueryPerformanceFrequency(out long lpFrequency); [DllImport("kernel32.dll")] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); #endregion //SafeNativeMethods #region Public Fields /// <summary>Gets the frequency of the timer as the number of ticks per second. This field is read-only.</summary> public static readonly long Frequency; /// <summary>Indicates whether the timer is based on a high-resolution performance counter. This field is read-only.</summary> public static readonly bool IsHighResolution; #endregion //Public Fields #region Private Fields private long elapsed; private bool isRunning; private long startTimeStamp; private static readonly double tickFrequency; #endregion //Private Fields #region Constructors static Stopwatch() { if (!QueryPerformanceFrequency(out Stopwatch.Frequency)) { Stopwatch.IsHighResolution = false; Stopwatch.Frequency = TimeSpan.TicksPerSecond; Stopwatch.tickFrequency = 1; } else { Stopwatch.IsHighResolution = true; Stopwatch.tickFrequency = TimeSpan.TicksPerSecond; Stopwatch.tickFrequency /= ((double)Stopwatch.Frequency); } } /// <summary>Initializes a new instance of the Stopwatch class.</summary> public Stopwatch() { this.Reset(); } #endregion //Constructors #region Private Methods private long GetElapsedDateTimeTicks() { long ticks = this.GetRawElapsedTicks(); if (Stopwatch.IsHighResolution) { double highTicks = ticks; highTicks *= Stopwatch.tickFrequency; return (long)highTicks; } return ticks; } private long GetRawElapsedTicks() { long elapsedTimestamp = this.elapsed; if (this.isRunning) { long currentTimestamp = Stopwatch.GetTimestamp(); long endTimestamp = currentTimestamp - this.startTimeStamp; elapsedTimestamp += endTimestamp; } return elapsedTimestamp; } #endregion //Private Methods #region Public Methods /// <summary>Gets the current number of ticks in the timer mechanism.</summary> /// <returns>A long integer representing the tick counter value of the underlying timer mechanism.</returns> public static long GetTimestamp() { if (Stopwatch.IsHighResolution) { long ticks = 0; QueryPerformanceCounter(out ticks); return ticks; } return DateTime.UtcNow.Ticks; } /// <summary>Stops time interval measurement and resets the elapsed time to zero.</summary> public void Reset() { this.elapsed = 0; this.isRunning = false; this.startTimeStamp = 0; } /// <summary>Starts, or resumes, measuring elapsed time for an interval.</summary> public void Start() { if (!this.isRunning) { this.startTimeStamp = Stopwatch.GetTimestamp(); this.isRunning = true; } } /// <summary>Initializes a new Stopwatch instance, sets the elapsed time property to zero, and starts measuring elapsed time.</summary> /// <returns>A Stopwatch that has just begun measuring elapsed time.</returns> public static Stopwatch StartNew() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); return stopwatch; } /// <summary>Stops measuring elapsed time for an interval.</summary> public void Stop() { if (this.isRunning) { long currentTimestamp = Stopwatch.GetTimestamp(); long endTimestamp = currentTimestamp - this.startTimeStamp; this.elapsed += endTimestamp; this.isRunning = false; } } #endregion //Public Methods #region Public Properties /// <summary>Gets the total elapsed time measured by the current instance.</summary> /// <value>A read-only System.TimeSpan representing the total elapsed time measured by the current instance.</value> public TimeSpan Elapsed { get { return new TimeSpan(this.GetElapsedDateTimeTicks()); } } /// <summary>Gets the total elapsed time measured by the current instance, in milliseconds.</summary> public long ElapsedMilliseconds { get { return (this.GetElapsedDateTimeTicks() / TimeSpan.TicksPerMillisecond); } } /// <summary>Gets the total elapsed time measured by the current instance, in timer ticks.</summary> public long ElapsedTicks { get { return this.GetRawElapsedTicks(); } } /// <summary>Gets a value indicating whether the Stopwatch timer is running.</summary> public bool IsRunning { get { return this.isRunning; } } #endregion //Public Properties }