Laden...

DispatcherTimer korrekt starten

Erstellt von m0rius vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.739 Views
m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 13 Jahren
DispatcherTimer korrekt starten

Hallo,

für eine Trink-Erinnerer-Anwendung verwende ich eine Klasse DrinkTimer, die intern einen System.Windows.Threading.DispatcherTimer timer verwendet und INotifyPropertyChanged implementiert.

/// <summary>
/// Gets or sets a value indicating whether this timer is currently running.
/// </summary>
/// <value><c>true</c> if this timer is running; otherwise, <c>false</c>.</value>
public bool IsEnabled
{
    get
    {
        return timer.IsEnabled;
    }
    set
    {
        if (timer.IsEnabled != value)
        {
            timer.IsEnabled = value;
            OnPropertyChanged("IsEnabled");
        }
    }
}

Jetzt frage ich mich, was der "korrekte" (?) Weg ist — timer.IsEnabled = true oder timer.Start()? Wenn ich die freie Wahl hätte, würde ich timer.Start() verwenden, was ich hier ja auch tun könnte (Fallunterscheidung von value). Das wäre allerdings eine Herangehensweise à la von hinten durch die Brust ins Auge.

Daher meine Frage: Gibt es irgendwelche Nachteile oder Nebenwirkungen, wenn ich den DispatcherTimer per timer.IsEnabled = true starte?

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo m0rius,

Gibt es irgendwelche Nachteile oder Nebenwirkungen, wenn ich den DispatcherTimer per timer.IsEnabled = true starte?

Warum sollte es?

Setting IsEnabled to true when the timer is stopped starts the timer.

Und andersherum:

Calling Start sets IsEnabled to true.

herbivore

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 13 Jahren

Hallo herbivore,

der gesunde Menschenverstand sagt das ja auch 😃. Nur frage ich mich, weshalb dann überhaupt die redundanten Methoden Start() und Stop() existieren. Diese implizieren IMO, dass es einen Unterschied in der Verwendung gibt. Aus ästhetischen Gründen, weil sich Code dadurch besser liest?

Wie dem auch sei - danke.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo m0rius,

Wenn ich die freie Wahl hätte ...

es gibt die beiden Wege, damit man die freie Wahl hat. Wie du gesehen hast, gibt es Fälle, in denen man mit IsEnabled deutlich besser fährt. Wenn man dagegen den Timer einfach nur an einer Stelle erzeugt und starten will, dann fährt man mit Start () besser.

herbivore

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo m0rius,

ich schließe mich herbivore an: Nimm das, was dir am sympathischsten bzw. am lesbarsten vorkommt.

Nichts desto trotz hilft auch immer ein Blick in den Reflector (über die Eleganz dieses Code lässt sich streiten...):


public bool IsEnabled
{
    get
    {
        return this._isEnabled;
    }
    set
    {
        lock (this._instanceLock)
        {
            if (!value && this._isEnabled)
            {
                this.Stop();
            }
            else if (value && !this._isEnabled)
            {
                this.Start();
            }
        }
    }
}

//...

public void Start()
{
    lock (this._instanceLock)
    {
        if (!this._isEnabled)
        {
            this._isEnabled = true;
            this.Restart();
        }
    }
}

Fazit: Es kommt unterm Strich gesehen auf's gleiche raus.

U
208 Beiträge seit 2008
vor 13 Jahren

Was entfernt auch noch zu diesem Thema passt: Tell, don't ask