Timers.Timer ObjectDisposedException

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von noBlubb.

    Timers.Timer ObjectDisposedException

    Servus Leute,

    Um vom GUI-Thread nicht abhängig zu sein nutze ich an manchen stellen System.Timers.Timer um dies eben auf einen anderen Thread auszulagern.

    Schön und gut klappt auch alles.

    Muss nun logischerweise auf Me.Invoke zurückgreifen im GUI-Thread etwas zu ändern...

    Das Problem welches nun ensteht kommt vom Schließen der GUI/Form.

    Da der Timer noch weiter läuft noch versucht per Invoke auf die Form zuzugreifen welche es jedoch nicht mehr gibt.
    ObjectDisposedException - Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "MainForm".


    Ich habe versucht das Problem zu beheben im Form_Closing Event die Timer zu Stoppen und zu Disposen was jedoch nicht zum Ziel führt.

    Weiteres habe ich bereits probiert auf den Timer zu warten und dann erst die Application zu schließen was auch nicht immer geklappt hat.

    Kennt jemand eine Lösung?

    MFG
    Invoken musst Du nur, wenn Du die Properties der GUI schreibst. Wenn Du sie ausliest (z.B. Me.IsDisposed), geht das ohne Invoke und Du kannst Dich zunächst überzeuigen, dass die Form och existiert.
    Andererseits solltest Du beim Beenden der Form zuerst den Timer stoppen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich habe es nun so verstanden und nun so probiert:

    VB.NET-Quellcode

    1. If Not Me.IsDisposed Then
    2. 'Hier mein Invoke
    3. End If


    Im Closing Event stoppe ich alle Timer.

    Leider wird weiterhin der Fehler geworfen - bringt mich echt zum Verzweifeln.

    Hat noch jemand einen Tipp?

    MFG
    Hi
    damit das überhaupt funktioniert, müsstest du auch die Form-Instanz sperren (SyncLock Me). Des weiteren kann die Form vmtl. geschlossen werden, während der Aufruf noch aktiv ist, da Invoke nur eine Methode in die Nachrichtenschleife einreiht. Lass dir mal ausgeben, in welcher Reihenfolge Close, Disposed usw. ablaufen, vllt gibt das Aufschluss darüber, warum das nicht funktioniert. Warum eigentlich nicht System.Windows.Forms.Timer?

    Ach ja: Notfalls könntest du vllt. auch über WM_CLOSE WndProc sperren, bis der Timer beendet wurde.

    Gruß
    ~blaze~
    Servus,

    Werde ich testen,

    Da ich mehrere Windows.Forms.Timer benötigen würde führt es leider dazu dass das Problem öfters stockt und nicht so ganz flüssig läuft.

    Ich brauche jedoch bei diesem Programm eine hohe verfügbarkeit und stabiltät, welche ich mit einem Threadsicheren Timer erreichen will.

    MFG
    Hey,

    wie wärs, wenn Du das Schliessen der Form mit:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    2. e.Cancel = True
    3. End Sub


    unterbindest.

    Gleichzeitig informierst Du Deinen Thread darüber, dass das Programm beendet werden möchte. Der Thread setzt nach Beendigung seiner Arbeit ein Flag und ruft danach .Close() auf.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    mcandy007 schrieb:

    Da ich mehrere Windows.Forms.Timer benötige
    Das sieht aber nach einem merkwürdigen Konzept aus.
    Was machen die denn?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    noBlubb schrieb:

    mit Sleep(100) unterbrechen anstatt den Timer zu verwenden?
    Gerade dafür gibt es Timer, um sein Programm nicht mit Sleep() auszubremsen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    dass er sein GUI bremsen soll...
    Deswegen nutze ich auch System.Timers.Timer und keinen Windows Forms Timer.

    Habe gestern noch eine Lösung gefunden - zwar nicht die feine englische Art jedoch funktionell.

    Ich stoppe im Closing Event alle Timer und disopse diese unterbreche das schließen der Form und verstecke diese nur.
    Nach einer Sekunden wird das Programm mit Application.Exit komplett beendet.

    Für bessere Lösungen bin ich weiterhin dankbar!

    MFG
    Naja...

    VB.NET-Quellcode

    1. Private updategui As Boolean = True
    2. Private updatethread As Thread
    3. Sub StartMain()
    4. updatethread = New Thread(AddressOf DoBackgroundWork)
    5. updatethread.Start()
    6. End Sub
    7. Sub EndMain()
    8. updategui = False
    9. End Sub
    10. Sub DoBackgroundWork()
    11. While updategui
    12. '..
    13. Thread.Sleep(100)
    14. End While
    15. End Sub


    Wenn updategui = false wird, wird der Thread seine Arbeit beenden und gut ist. Vielleicht noch ein updatethread.IsBackground, aber so sollte es eigentlich ohne Exception enden...