myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Dispatchertimer "Dispose" - sichergehen, dass er gelöscht wird
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Dispatchertimer "Dispose" - sichergehen, dass er gelöscht wird

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
EyeTrackJack EyeTrackJack ist männlich
myCSharp.de-Mitglied

Dabei seit: 24.01.2019
Beiträge: 20
Entwicklungsumgebung: Visual Studio


EyeTrackJack ist offline

Dispatchertimer "Dispose" - sichergehen, dass er gelöscht wird

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
Ich habe eine Klasse (MouseMover), die einen Dispatchertimer (MouseMoveTimer) enthält und nicht immer verwendet wird bzw. während der Laufzeit gelöscht werden muss.
An welcher Stelle in der Klasse muss veranlasst werden, dass der Timer gelöscht wird? Ich habe bis jetzt Folgendes. Ist es so korrekt? Und vor allem, muss das so kompliziert sein? Es geht doch nur darum, den Timer am Ende loszuwerden, wenn die Klasse nicht mehr benötigt wird.

C#-Code:
        public MouseMover()
        {
            MouseMoveTimer.Tick += MouseMoveTimer_Tick; //der besagte Dispatchertimer
        }

        ~MouseMover()
        {
            Dispose(false);
        }

        protected void Dispose(bool disposing)
        {
            if (disposing)
            {
                // Code to dispose the managed resources of the class
            }

            // Code to dispose the un-managed resources of the class
            MouseMoveTimer.Stop();
            MouseMoveTimer.Tick -= MouseMoveTimer_Tick;
            MouseMoveTimer = null;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EyeTrackJack am 21.06.2019 20:23.

21.06.2019 20:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.320
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Soweit ich dies auf den ersten Blick sehen kann, ist DispatcherTimer eine normale Klase die nicht disposed werden muss.
Entsprechend kann der GC deine Klasse dann auch ohne Dispose/Finalizer wegräumen.

Links:
 DispatcherTimer Doku
 Referenz Code von DispatcherTimer

T-Virus
21.06.2019 20:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
EyeTrackJack EyeTrackJack ist männlich
myCSharp.de-Mitglied

Dabei seit: 24.01.2019
Beiträge: 20
Entwicklungsumgebung: Visual Studio

Themenstarter Thema begonnen von EyeTrackJack

EyeTrackJack ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das Problem ist, dass der Timer gestoppt werden muss, bevor die Klasse aus dem Speicher entfernt wird. Er läuft sonst weiter und ich habe keine Kontrolle darüber mehr.
21.06.2019 21:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.320
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dann reicht ein einfacher Aufruf in Disposed, was du ja bereits hast.
Ggf. noch mit einer isDisposed Member Variable prüfen ob Dispose schon durchgelaufen ist.
Wenn ja, musst du ja nichts mehr machen.

Nachtrag:
Du brauchst dann auch keine MouseMoveTimer nicht auf null setzen.
Wenn dein Objekt vom GC weggeräumt wird, kümmert er sich darum.

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 21.06.2019 21:52.

21.06.2019 21:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 277
Herkunft: Köln


KroaX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
bevor die Klasse aus dem Speicher entfernt wird. Er läuft sonst weiter und ich habe keine Kontrolle darüber mehr.

Ist das wirklich so? Ich bin mir da nicht so sicher. mMn. hat diese Dispose Implementierung gar keinen Vorteil
22.06.2019 09:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.052
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Timer jerglicher Art kann man super einfacher und sicherer - und viel besser - mit Rx umsetzen.
 Reactive Extensions (Rx) – Part 4 – Replacing Timers

Zitat von T-Virus:
Du brauchst dann auch keine MouseMoveTimer nicht auf null setzen.
T-Virus

Es gilt zum guten Ton (und irgendwo gibt es auch eine Empfehlung dazu), dass das Objekt auf null gesetzt werden soll.
Nach dem Disposen ist das Objekt in seiner ursprünglichen Form ohnehin nicht mehr nutzbar.

Der Vorteil beim Null: kann das Objekt null sein, sagen Dir statische Codechecks an den gewissen Stellen, dass man vor einem Zugriff auf null checken sollte, solltest Du extern irgendwo drauf zugreifen.
Darauf kann man deutlich besser und stabiler reagieren als auf eine Disposed-Exception.
22.06.2019 13:30 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.320
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Abt
Wäre mir ehrlich gesagt neu.
Ich kenne es nur bei Handles, dass man diese auch auf IntPtr.Zero setzten sollte.
Auch in der Doku finde sich kein Beispiel oder Hinweis dazu, dass man hier explizit Null setzen sollte.
Wäre es nicht sogar im Sinne des Dispose Musters, wenn die interna dann auch eine Dispose Meldung liefern anstelle von null?
Null ist für mich eher ein Indikator einer fehlenden Initalisierung, nicht aber einer Freigabe durch ein Dispose.

Nachtrag:
Ein schnelles Beispiel wäre z.B. in SqlConnection.
Dort wird im Dispose dann die Credentials und das Access Token genullt.
In diesem Szenario macht es auch Sinn, damit diese Daten nicht mehr im Speicher hängen obwhl die Verbindung terminiert ist.

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 22.06.2019 18:35.

22.06.2019 18:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.052
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von T-Virus:
Wäre es nicht sogar im Sinne des Dispose Musters, wenn die interna dann auch eine Dispose Meldung liefern anstelle von null?

Nicht wirklich. Externer Code muss die Implementierung von Dispose nicht kennen.

Zitat von T-Virus:
Null ist für mich eher ein Indikator einer fehlenden Initalisierung, nicht aber einer Freigabe durch ein Dispose.

Naja, das ist ja nicht der Sinn von null.

Zitat von T-Virus:
In diesem Szenario macht es auch Sinn, damit diese Daten nicht mehr im Speicher hängen obwhl die Verbindung terminiert ist.

Mit dem Satz widersprichst Du Dir abstrakt selbst.
"nicht mehr im Speicher hängen" trifft ja auf eine gewisse Art und Weise auf jede Dispose-Implementierung zu. ;-)
22.06.2019 18:49 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 14.10.2019 07:27