ToolstripmenuItem wird nicht aktualisiert

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    ToolstripmenuItem wird nicht aktualisiert

    Hallo,

    ich habe ein AktualisierenToolStripMenuItem.Click Event, das eine Methode aufruft, die eine Weile dauert. Deswegen läuft die mit Async Await.
    Aber ich krieg das ToolStripMenuItem nicht deaktiviert, ich kann da trotzdem weiterdraufklicken.

    VB.NET-Quellcode

    1. Private Sub AktualisierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AktualisierenToolStripMenuItem.Click
    2. AktualisierenToolStripMenuItem.Enabled = False
    3. Aktualisieren()
    4. AktualisierenToolStripMenuItem.Enabled = True
    5. End Sub
    6. Private Async Sub Aktualisieren()
    7. ...
    8. End Sub

    Liegt das daran, dass das Event erst durch sein muss, bis der .Enabled Wechsel an das Item geht.

    Viele Grüße
    Das ist das Fiese an Nebenläufigkeit. Man muss immer wieder erkennen, was wann abgearbeitet, unterbrochen und später weiterverarbeitet wird. Richtig muss es lauten

    VB.NET-Quellcode

    1. Private Async Sub AktualisierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AktualisierenToolStripMenuItem.Click
    2. AktualisierenToolStripMenuItem.Enabled = False
    3. Threading.Tasks.Task.Run(sub() Aktualisieren())
    4. AktualisierenToolStripMenuItem.Enabled = True
    5. End Sub
    6. Private Sub Aktualisieren()
    7. ...
    8. End Sub

    Bei Deiner Version wird Aktualisieren aufgerufen und sobald da der Nebenthread gestartet wird, bricht die Abarbeitung von Aktualisieren im Hauptthread ab und kehrt zur aufrufenden Methode zurück. Und was kommt da als nächster Befehl? Zeile#4! Wenn dann die nebenläufige Aufgabe innerhalb von Aktualisieren fertig ist, geht es mit dem Restcode von Aktualisieren weiter.

    Was macht meine Variante? Sie ruft Aktualisieren nebenläufig auf und bricht dann die Methode AktualisierenToolStripMenuItem_Click ab. Wenn Aktualisieren fertig ist, macht das Programm mit dem Code weiter, der danach kommt, nämlich Zeile#4. Wie gewollt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.