In einer asynchronen Sub wird eine neue Instanz eines Dialogs erstellt. Threadübergeifender Vorgang trotz Gebrauch von Me.Invoke

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    In einer asynchronen Sub wird eine neue Instanz eines Dialogs erstellt. Threadübergeifender Vorgang trotz Gebrauch von Me.Invoke

    Hallo, ich schreibe ein Programm, welches Dateien synchronisiert. Ich wollte einen Kopierdialog anzeigen lassen, wie man ihn von Windows kennt. Alle ... Minuten soll geprüft werden, ob es neue Dateien gibt. Die Timer-Tick-Sub ist asynchron, daher ist die aufgerufene Sub Copy() es auch. Ich verwende Me.invoke(), dennoch heißt es ungültiger threadübergreifender Vorgang. Der Fehler ist in der Sub Copy(). Weiß jemand Rat?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Copy()
    2. Using KD As New Kopierdialog
    3. Me.Invoke(Sub() KD.Show(Me))
    4. For Each _file As IO.FileInfo In zu_kopierende_Dateien_Liste
    5. _file.CopyTo(wohin_kopieren & _file.Name, True)
    6. Next
    7. End Using
    8. End Sub
    9. Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    10. Await Task.Run(Sub()
    11. Dim DI As IO.DirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(Ordnerpfad)
    12. Scan_Directory_and_check_whether_Files_are_new(DI)
    13. Copy()
    14. End Sub)
    15. End Sub


    @Bartosz Wenn ich das so richtig verstehe, laufen KD und Me in unterschiedlichen Threads, da knallt natürlich der Aufruf KD.Show(Me).
    Probierma

    VB.NET-Quellcode

    1. KD.Show()
    2. KD.TopMost = True
    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!
    Durch den nebenläufigen Aufruf hast Du ja 2 Threads. MainThread und NebenThread. KD wird nun in NebenThread erzeugt. Und mit Me.Invoke(Sub() KD.Show(Me)) willst Du im MainThread KD mittels Show eine Anweisung erteilen. Das crasht. Bei Einsteigern taucht dieses Problem andersrum auf. Sie versuchen im NebenThread auf ein Form im MainThread zuzugreifen.
    Stellt sich nur die Frage, ob die hiesige Konstruktion insgesamt so optimal ist. Alternativ könntest Du KD als Dialog aufrufen. Da scheint es keine Probleme zu geben: Me.Invoke(Sub() KD.ShowDialog(Me))
    Musst allerdings den Kopiervorgang dann innerhalb des Dialogs ausführen.
    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.
    Danke euch! So läuft's!

    VB.NET-Quellcode

    1. Using KD As New Kopierdialog
    2. KD.Show()
    3. KD.TopMost = True
    4. For Each _file As IO.FileInfo In zu_kopierende_Dateien_Liste
    5. _file.CopyTo(wohin_kopieren & _file.Name, True)
    6. Next
    7. End Using


    KD wird nun in NebenThread erzeugt. ... Bei Einsteigern taucht dieses Problem andersrum auf. Sie versuchen im NebenThread auf ein Form im MainThread zuzugreifen.
    Ja, du hast Recht. Jetzt leuchtet es mir ein

    Als Dialog aufrufen ist nicht das Ziel, ich will auf dieser zweiten Form nichts anklicken müssen ("OK" klicken müssen). Aber es stimmt. Da gibt es keine Probleme: Me.Invoke(Sub() KD.ShowDialog(Me))