FileSystemWatcher - Ungültiger threadübergreifender Vorgang

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von boozone.

    FileSystemWatcher - Ungültiger threadübergreifender Vorgang

    Hallo Community,

    ich hoffe ihr könnt mir helfen!

    ich versuche mittels FileSystemWatcher meine .txt Dateien auf Änderungen zu überwachen.
    Sollte sich dann was ändern, soll die .txt Datei nochmal neu gelesen werden und der Inhalt an eine Textbox übergeben werden.

    Das ganze brauche ich für ein auf Textdatei basierter Chatclient.

    Ich mach das derzeit so:


    VB.NET-Quellcode

    1. Public WithEvents m_fsv As FileSystemWatcher
    2. ...
    3. Private Sub m_fsv_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles m_fsv.Changed
    4. Using reader As StreamReader = New StreamReader(TruePfad & "\" & AusgewaehleTxtDatei)
    5. tbInhalt.Text = reader.ReadToEnd
    6. reader.Close()
    7. End Using
    8. End Sub
    9. ...
    10. Private Sub lbTxtAuswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbTxtAuswahl.SelectedIndexChanged
    11. ...
    12. Try
    13. 'Es wird versucht vorhandene Text Dateien einzulesen
    14. Using reader As StreamReader = New StreamReader(TruePfad & "\" & AusgewaehleTxtDatei)
    15. tbInhalt.Text = reader.ReadToEnd
    16. reader.Close()
    17. End Using
    18. 'FileSystemWatcher soll aktiviert werden
    19. m_fsv = New FileSystemWatcher(TruePfad)
    20. m_fsv.EnableRaisingEvents = True
    21. m_fsv.SynchronizingObject = value
    22. m_fsv.Filter = "*.txt"
    23. Catch ex As Exception
    24. ....
    25. End Try
    26. ...
    27. End Sub


    Leider funktioniert das nicht ganz. Mein Programm schließt sich einfach ohne Fehlermeldung.
    Beim Debuggen bin ich jetzt auf diesen Fehler gestoßen:

    "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbInhalt.Text erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

    Jetzt habe ich natürlich auch schon ein wenige recherchiert und bin auf begriffe wie Invoke und dergleichen gestoßen.

    Leider, evtl. auch durch falsche Anwendung, hat mir das nicht weiter geholfen.

    Ich wäre wirklich dankbar wen mir hier jemand helfen könnte :)

    Viele Grüße,
    Danny

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „boozone“ ()

    Okay, ich habe was ausprobiert was ich im Zusammenhang mit dem filesystemwatcher gefunden habe:

    VB.NET-Quellcode

    1. Public WithEvents m_fsv As FileSystemWatcher
    2. Public Property SynchronizingObject As ISynchronizeInvoke
    3. 'Benutzen
    4. Dim value As ISynchronizeInvoke
    5. ...
    6. Private Sub m_fsv_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles m_fsv.Changed
    7. Using reader As StreamReader = New StreamReader(TruePfad & "\" & AusgewaehleTxtDatei)
    8. tbInhalt.Text = reader.ReadToEnd
    9. reader.Close()
    10. End Using
    11. End Sub
    12. ...
    13. Private Sub lbTxtAuswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbTxtAuswahl.SelectedIndexChanged
    14. ...
    15. Try
    16. 'Es wird versucht vorhandene Text Dateien einzulesen
    17. Using reader As StreamReader = New StreamReader(TruePfad & "\" & AusgewaehleTxtDatei)
    18. tbInhalt.Text = reader.ReadToEnd
    19. reader.Close()
    20. End Using
    21. m_fsv = New FileSystemWatcher(TruePfad)
    22. m_fsv.EnableRaisingEvents = True
    23. m_fsv.SynchronizingObject = value 'Invoke?
    24. m_fsv.Filter = "*.txt"
    25. Catch ex As Exception
    26. ...
    27. End Try
    28. ...
    29. End Sub


    Hier habe ich diesen Lösungsansatz gefunden:
    msdn.microsoft.com/de-de/libra…izingobject(v=vs.80).aspx

    leider, wie gesagt, hat es so bei mir auch nicht funktioniert.

    Viele Grüße,
    Danny
    Das ist nur ein Versuch. Der Client nutzt die Synchronisierungsfunktion z.b. von DropBox.
    Die Text Datei wird ausgetauscht und der Client ließt sie ein. Schon hat man einen "Chat".

    Ob das jetzt unsinn ist, will ich gar nicht bestreiten. Ich mach es ohnehin nur für mich.

    Hat noch jemand eine Idee?

    Viele Grüße,
    Danny
    Also ich habe jetzt alle TryCatchens im Code weggemacht. Aber selbst dann beendet sich das Programm einfach ohne Fehlermeldung.

    Im Debuggen kommt immer noch dies hier raus:
    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbInhalt erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde

    Diese Funktion:

    VB.NET-Quellcode

    1. Public WithEvents m_fsv As FileSystemWatcher
    2. 'Public Property SynchronizingObject As ISynchronizeInvoke
    3. 'Benutzen
    4. 'Dim value As ISynchronizeInvoke


    VB.NET-Quellcode

    1. Private Function Readtxt(ByVal TruePfad As String, ByVal AusgewaehleTxtDatei As String)
    2. 'Ausgewählte Textdatei wird gelesen. Inhalt wird der TextBox übergeben
    3. Using reader As StreamReader = New StreamReader(TruePfad & "\" & AusgewaehleTxtDatei)
    4. tbInhalt.Text = reader.ReadToEnd
    5. reader.Close()
    6. End Using
    7. Return Nothing
    8. End Function


    Sagt im Debug:

    tbInhalt.text =
    AccessibilityObject = {"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbInhalt erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."}

    Die Funktion Readtxt wird hier aufgrufen:

    VB.NET-Quellcode

    1. Private Sub m_fsv_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles m_fsv.Changed
    2. Readtxt(TruePfad, AusgewaehleTxtDatei)
    3. End Sub


    Und hier wir der filesystemwatcher erstellt:

    VB.NET-Quellcode

    1. Private Sub lbTxtAuswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbTxtAuswahl.SelectedIndexChanged
    2. AusgewaehleTxtDatei = lbTxtAuswahl.SelectedItem
    3. If GetPfad = Nothing Then
    4. If TruePfad = Nothing Then
    5. MessageBox.Show("Du musst zuerst einen Pfad angeben!",
    6. "Achtung!", _
    7. MessageBoxButtons.OK, _
    8. MessageBoxIcon.Exclamation, _
    9. MessageBoxDefaultButton.Button1)
    10. Else
    11. 'Try
    12. Readtxt(TruePfad, AusgewaehleTxtDatei)
    13. m_fsv = New FileSystemWatcher(TruePfad)
    14. m_fsv.EnableRaisingEvents = True
    15. 'm_fsv.SynchronizingObject = value
    16. m_fsv.Filter = "*.txt"
    17. 'Catch ex As Exception
    18. If lbTxtAuswahl.SelectedItem = "Keine Dateien vorhanden" Then
    19. 'Es wird nicht unternommen
    20. Else
    21. 'Evtl falscher Pfad!
    22. 'Nicht Optimal gelöst!
    23. MessageBox.Show("Du hast womöglich einen falschen Pfad angegeben!",
    24. "Achtung!", _
    25. MessageBoxButtons.OK, _
    26. MessageBoxIcon.Exclamation, _
    27. MessageBoxDefaultButton.Button1)
    28. End If
    29. 'End Try
    30. End If
    31. Else
    32. MessageBox.Show("Du musst deinen Pfad noch abspeichern!",
    33. "Achtung!", _
    34. MessageBoxButtons.OK, _
    35. MessageBoxIcon.Exclamation, _
    36. MessageBoxDefaultButton.Button1)
    37. End If
    38. End Sub


    Falls du noch mehr Code sehen musst, sag bescheid.

    Vielen Dank schonmal.
    Danny
    ich verstehe ühaupt nicht, wie sich das prog einerseits ohne fehlermeldung verabschiedet, annererseits aber im debugmode durchaus fehlermeldungen raushaut.

    aber sagt dodo denn auch, welche Methode per Invoking aufgerufen wern muß?

    Es ist die ReadText - Methode, in m_fsv_Changed().

    VB.NET-Quellcode

    1. Private Sub m_fsv_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles m_fsv.Changed
    2. me.Invoke(new Action(Of String, String)(addressof REadText),TruePfad, AusgewaehleTxtDatei)
    3. End Sub
    (glaubich - der code ist recht unübersichtlich)

    zur übersichtlichkeit täte ich empfehlen, innerhalb der methoden alle leerzeilen zu entfernen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    boozone schrieb:

    Ich hab leider keine ahnung^^
    Sobald ich es rausgefunden habe, schreib ich dir eine PN :)

    mein Gott!

    du wirst doch irgendein Knöpfchen gedrückt haben, dasses startet! Das läuft doch nicht von alleine los und stürzt kommentarlos ab!

    ich zB drücke immer F5, und dann läufts los, und zwar im Debug-Mode.
    Naja klar hab ich das Programm bedient. Bei der Änderung einer .txt Datei von ausserhalb ist das Programm ohne Fehlermeldung abgestürzt.
    Wieso wissen wir ja. Aber warum ohne Fehlermeldung - kA. :)

    EDIT:// Ja ich lass es auch im Debugmode laufen.