public bool StopTimer()
        {
            lock (this)
            {
                if (this.IsTimerRunning)
                {
                    this.IsTimerRunning = false;
                    if (this.timerThread != null)
                    {
                        this.wakeTimerThreadEvent.Set();

                        // remark: stopping the timer does not cause the timer thread to leave the loop.
                        if (this.timerHandler != null)
                        {
                            var now             = DateTime.Now;
                            var remainingPeriod = this.EndTime - now;
                            var newHint         = new TimerHint(remainingPeriod, TimerEventType.Stopped, this.name, this.ElapseProperties);

                            try
                            {
                                this.timerHandler.OnTimerEvent(newHint);
                            }
                            catch (BaseException)
                            {
                            }
                        }
                    }
                }
            }

            return(this.IsTimerRunning == false);
        }
        public bool KillTimer()
        {
            lock (this)
            {
                if (this.timerThread != null)
                {
                    this.IsTimerRunning = false;
                    this.shutdown       = true;

                    this.wakeTimerThreadEvent.Set();

                    this.timerThread.Join();
                    this.timerThread = null;

                    if (this.timerHandler != null)
                    {
                        var now             = DateTime.Now;
                        var remainingPeriod = this.EndTime - now;
                        var newHint         = new TimerHint(remainingPeriod, TimerEventType.Killed, this.name, this.ElapseProperties);

                        try
                        {
                            this.timerHandler.OnTimerEvent(newHint);
                        }
                        catch (BaseException)
                        {
                        }
                    }
                }
            }

            return(this.timerThread == null);
        }
        protected void Elapse()
        {
            if (this.timerHandler != null)
            {
                var newHint = new TimerHint(new TimeSpan(0), TimerEventType.Elapsed, this.name, this.ElapseProperties);

                try
                {
                    this.timerHandler.OnTimerEvent(newHint);
                }
                catch (BaseException)
                {
                }
            }
        }
        protected void Tick()
        {
            if (this.timerHandler != null)
            {
                var now             = DateTime.Now;
                var remainingPeriod = this.EndTime - now;
                var newHint         = new TimerHint(remainingPeriod, TimerEventType.Tick, this.name, this.TickProperties);

                try
                {
                    this.timerHandler.OnTimerEvent(newHint);
                }
                catch (BaseException)
                {
                }
            }
        }
        public bool StartTimer(TimeSpan timeSpanToSet)
        {
            if (this.IsTimerRunning)
            {
                return(false);
            }

            lock (this)
            {
                this.timeSpan = timeSpanToSet;

                // set new start/end time
                this.StartTime = DateTime.Now;
                this.EndTime   = this.StartTime + this.timeSpan;

                // let the timer run !!!!
                this.IsTimerRunning = true;
                this.shutdown       = false;

                if (this.timerThread == null)
                {
                    this.wakeTimerThreadEvent.Reset();
                    this.timerThreadStartedEvent.Reset();

                    // create and start the timer thread
                    this.timerThread = new Thread(this.TimerThread);
                    this.timerThread.Start(this);

                    // wait for started
                    this.timerThreadStartedEvent.WaitOne();
                }
                else
                {
                    // restart timer
                    this.wakeTimerThreadEvent.Set();
                }

                if (this.timerHandler != null)
                {
                    var newHint = new TimerHint(this.timeSpan, TimerEventType.Started, this.name, this.ElapseProperties);
                    this.timerHandler.OnTimerEvent(newHint);
                }
            }

            return(this.IsTimerRunning);
        }
        /// <summary>
        /// This method is firing the TimerEvent.
        /// </summary>
        /// <param name="hint">Hint containing information about the timer and the type of event fired.</param>
        internal void OnTimerEvent(TimerHint hint)
        {
            var timerEvent = this.TimerEvent;

            if (timerEvent != null)
            {
                EventHandlerStopTimer stopTimerDelegate = null;

                if (this.timerInfos.ContainsKey(hint.Name))
                {
                    stopTimerDelegate = this.timerInfos[hint.Name].StopTimer;
                }

                var timerEventArgs = new TimerEventArgs(hint, stopTimerDelegate);

                timerEvent(this, timerEventArgs);
            }
        }