/// <summary>
        /// Initializes a new <see cref="MicroStopwatch"/> instance, sets the elapsed time property to zero,
        /// and starts measuring elapsed time.
        /// </summary>
        ///
        /// <param name="throwOnLowResolution">
        /// If true and <see cref="Stopwatch.IsHighResolution"/> is false, throws an exception.
        /// </param>
        /// <returns>A <see cref="MicroStopwatch"/> that has just begun measuring elapsed time.</returns>
        ///
        /// <exception cref="NotSupportedException">
        /// <see cref="Stopwatch.IsHighResolution"/> is false and <paramref name="throwOnLowResolution"/> is
        /// true.
        /// </exception>
        public static MicroStopwatch StartNew(bool throwOnLowResolution)
        {
            MicroStopwatch watch = new MicroStopwatch(throwOnLowResolution);

            watch.Start();
            return(watch);
        }
        void NotificationTimer(long lTimerInterval,
                               long lIgnoreEventIfLateBy, ref bool bStopTimer)
        {
            int  nTimerCount       = 0;
            long lNextNotification = 0;
            long lCallbackFunctionExecutionTime = 0;

            MicroStopwatch microStopwatch = new MicroStopwatch();

            microStopwatch.Start();

            while (!bStopTimer)
            {
                lCallbackFunctionExecutionTime =
                    microStopwatch.ElapsedMicroseconds - lNextNotification;
                lNextNotification += lTimerInterval;
                nTimerCount++;
                long lElapsedMicroseconds = 0;

                while ((lElapsedMicroseconds =
                            microStopwatch.ElapsedMicroseconds) < lNextNotification)
                {
                }

                long lTimerLateBy = lElapsedMicroseconds - (nTimerCount * lTimerInterval);

                if (lTimerLateBy < lIgnoreEventIfLateBy)
                {
                    MicroTimerEventArgs microTimerEventArgs =
                        new MicroTimerEventArgs(nTimerCount, lElapsedMicroseconds,
                                                lTimerLateBy, lCallbackFunctionExecutionTime);
                    MicroTimerElapsed(this, microTimerEventArgs);
                }
            }

            microStopwatch.Stop();
        }