[C# 2010] PauseTimer Class

05/19/2013 15:50 King Sora#1
Heyho!
Mich hat es sehr genervt, dass es beim DispatcherTimer keine Methode zum pausieren gab. Also habe ich beschlossen eine Erweiterung in Form von einer neuen Klasse zu schreiben!
Da der "PauseTimer" von der DispatcherTimer Klasse erbt, verhält er sich genau wie ein DispatcherTimer. Bis auf die "Pause" Methode und einem neuen Attribut gibt es nichts wirklich neues was für euch von Bedeutung wäre!
Zur Pause Methode:
Es gibt einen Parameter der übergeben wird. Dieser ist vom Typ PauseStatus (Dieses Enum ist auch neu!)
und gibt an ob die Pause beginnt oder endet. Falls die Pause aufgrund von verschiedenen Gründen nicht beginnen oder
enden kann (Timer läuft garned oder ist schon gestoppt), gibt es Abfragen die Fehler verhindern.

Zum IsPaused Attribut:
Dieses Attribut ist ein Boolean und gibt an, ob der Timer Pausiert ist oder nicht.

Zur Klasse:
PHP Code:
using System;
using System.Windows.Threading;
using System.Diagnostics;

/*
Geschrieben am 19.05.2013.
Geschrieben von King Sora.
*/

public enum PauseStatus BeginEnd }

class 
PauseTimer DispatcherTimer 
{
    private 
Stopwatch _observeTick;
    private 
TimeSpan _oldInterval;
    private 
bool _pausePossible;
    private 
bool _timerIsPaused;

    public 
PauseTimer() : base()
    {
        
this._pausePossible false;
        
this._observeTick = new Stopwatch();
        
this._oldInterval = new TimeSpan(00000);
        
this.Tick += new EventHandler(tick);
    }

    public 
PauseTimer(DispatcherPriority priority
        : 
base(priority)
    {
        
this._pausePossible false;
        
this._observeTick = new Stopwatch();
        
this._oldInterval = new TimeSpan(00000);
        
this.Tick += new EventHandler(tick);
    }

    public 
PauseTimer(DispatcherPriority priorityDispatcher dispatcher
        : 
base(prioritydispatcher)
    {
        
this._pausePossible false;
        
this._observeTick = new Stopwatch();
        
this._oldInterval = new TimeSpan(00000);
        
this.Tick += new EventHandler(tick);
    }

    public 
PauseTimer(TimeSpan intervalDispatcherPriority priorityEventHandler callbackDispatcher dispatcher
        : 
base(intervalprioritycallbackdispatcher)
    {
        
this._pausePossible false;
        
this._observeTick = new Stopwatch();
        
this._oldInterval = new TimeSpan(00000);
        
this.Tick += new EventHandler(tick);
    }

    public 
bool IsPaused
    
{
        
get { return _timerIsPaused; }
        
set { }
    }

    public new 
void Start()
    {
        
base.Start();
        
this._observeTick.Start();
        
this._pausePossible true;
    }

    public new 
void Stop()
    {
        
base.Stop();
        
_observeTick.Stop();
        
this._pausePossible false;
    }

    public 
void Pause(PauseStatus pauseStatus)
    {
        if (
pauseStatus == PauseStatus.Begin && this.IsEnabled && this._observeTick.IsRunning && this._pausePossible == true)
        {
            
this._timerIsPaused true;
            
this._oldInterval this.Interval;
            
this.Interval = new TimeSpan(0000, ((int)this._oldInterval.TotalMilliseconds - (int)_observeTick.ElapsedMilliseconds));
            
this.Stop();
            
this._observeTick.Stop();
        }
        else if (
pauseStatus == PauseStatus.End && this.IsEnabled == false && this._observeTick.IsRunning == false && this._timerIsPaused)
        {
            
this._timerIsPaused false;
            
this.Start();
            
this._observeTick.Start();
            
this.Tick += new EventHandler(tickAfterPause);
        }
    }

    private 
void tickAfterPause(object senderEventArgs e)
    {
        
this.Interval this._oldInterval;
        
this.Start();
        
this.Tick -= new EventHandler(tickAfterPause);
    }

    private 
void tick(object senderEventArgs e)
    {
        
this._observeTick.Restart();
    }

Im Anhang habt ihr nochmal diese Klasse mit Kommentaren!

Programm zum Veranschaulichen:
Ich habe euch noch ein Programm angehängt, das diese Klasse gleich testet.
Screen:
[Only registered and activated users can see links. Click Here To Register...]

Bevor ichs vergesse, bitte gebt mir Feedback oder Kritik zu der Klasse (ist gern gesehen :))
und meldet Bugs oder Fehler.
Ich behebe sie gerne und update diesen Thread!

Hoffentlich hilft euch die Klasse etwas!
[Only registered and activated users can see links. Click Here To Register...]