Ungültiger Threadübergreifender Vorgang Backgroundworker

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Ungültiger Threadübergreifender Vorgang Backgroundworker

    Hallo,
    ich bastel gerade ein Tool mit dem ich Bilder von einem Speichermedium direkt in einen Ordner kopieren kann Problem bei der Verwendung vom Backgroundworker für den Kopiervorgang und die Statusanzeige funktioniert nicht.
    Kopieren an sich geht wenn ich den die befehle für Label,Progressbar und co auskommentiere.

    Das ist der Background Worker

    Visual Basic-Quellcode

    1. Private Sub Kopiervorgang_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles Kopiervorgang.DoWork
    2. My.Computer.FileSystem.CreateDirectory(OrdnerPfad)
    3. For Each c As String In IO.Directory.GetFiles(KameraPfad, "*.*")
    4. d = d + 1
    5. Next
    6. Try
    7. Statusleiste.Maximum = d
    8. L_status.Text = "Dateien: " & d
    9. For Each s As String In IO.Directory.GetFiles(KameraPfad, "*.*")
    10. Dim fi As New IO.FileInfo(s)
    11. TB_status.AppendText("Kopiere: " & OrdnerPfad + "\" + fi.Name & " .... ")
    12. IO.File.Copy(s, OrdnerPfad + "\" + fi.Name)
    13. Statusleiste.Value += 1
    14. TB_status.AppendText("OK" & vbNewLine)
    15. Next
    16. Catch ex As Exception
    17. MsgBox(ex.Message)
    18. End Try
    19. End Sub

    Was muss ich da ändern ?

    DANKE für eure Hilfe!
    Bilder
    • sdgfs.JPG

      21,87 kB, 505×224, 196 mal angesehen
    Du nutzt VB.Net, nicht VB6 passe also Threadtag und Codetag entsprechend an.


    Als erstes würde ich dir mal raten dich in richtiges Multithreading einzuarbeiten also Threads erstellen, Aufgaben zuweisen und Async/Await kann auch nicht schaden.
    Der Backgroundworker ist nämlich eher ungeeignetes Threading.

    Beim Threading muss man GUI und Daten trennen, sonst geht das so in die Hose. Die GUI läuft in einem extra Thread, da von anderen Threads aus reinzugrabschen wird vom Programm nicht toleriert, wie das dann aussieht siehst du an der Exception.

    Zu lösen ist das ziemlich einfach, die Lösung heißt Invoke(bzw BeginInvoke/EndInvoke), dabei Invokest du vom Nebenthread in einem Control eine Methode, sodass diese Methode im GUI-Thread und nicht im Nebenthread ausgeführt wird. Wie Invoken geht kannst du bei MSDN und Google nachlesen. (Und halte dich von der CheckForIllegalCrossThreadCalls-Property fern, das ist kein korrektes Threading)

    Außerdem will ich zu deinem Snippet was anmerken:
    -Meide den My-Namespace, für alles außer Resources und Settings gibt es bessere Alternativen
    -Nutze Path.Combine
    -lade die Dateien in ein Array, hole dir da die Länge und gehe dieses Array durch, so wie das jetzt ist, ist das suboptimal

    LG

    paydayclown schrieb:

    ändern
    Wenn schon BackgroundWorker, dann richtig BackgroundWorker.
    Nutze die Properties und Methoden des BGW. Mach ne neue Form mit Button und BGW:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Me.BackgroundWorker1.WorkerReportsProgress = True
    4. Me.BackgroundWorker1.RunWorkerAsync()
    5. End Sub
    6. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    7. Me.BackgroundWorker1.ReportProgress(42)
    8. End Sub
    9. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    10. MessageBox.Show(e.ProgressPercentage.ToString)
    11. End Sub
    12. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    13. MessageBox.Show("Feddich")
    14. End Sub
    15. End Class
    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!