Thread Problem

  • VB.NET

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

    Thread Problem

    Hey Community,

    bei folgendem Code bekomme ich diese Meldung: "Cross-thread operation not valid: Control 'jungle' accessed from a thread other than the thread it was created on."
    Ich lass eine Funktion aufrufen die in einem Thread laufen soll.
    Code:

    VB.NET-Quellcode

    1. s1.Text = wc.DownloadString("ftp://ftp-web.ohost.de/alpasfasfasfasfg/" & item & "/s1.txt")
    2. s2.Text = wc.DownloadString("ftp://ftp-web.ohost.de/alphatroasfasfg/" & item & "/s3txt")
    3. s3.Text = wc.DownloadString("ftp://ftp-web.ohost.de/alphaasfasfg/" & item & "/s3.txt")
    4. s4.Text = wc.DownloadString("ftp://ftp-web.ohost.de/alasfasf/" & item & "/s2.txt")
    5. s5.Text = wc.DownloadString("ftp://ftp-web.ohost.de/alphasfasfasf/" & item & "/s5.txt")


    Mfg

    Cronax
    Hm... ich habe jetzt folgendes gemacht:

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Invoke(wertschreiben)
    3. End Sub


    VB.NET-Quellcode

    1. Public Function wertschreiben()
    2. s1.Text = "hallo"
    3. s2.Text = "hallo1"
    4. End Function


    Kommt trotzdem der selbe Fehler
    AddressOf. Funktionen ohne Rückgabewerte sind als Sub zu definieren, nicht als Function. Dann passiert dir auch das nicht. Es wäre außerdem Invoke(AddressOf wertschreiben) und in deinem Fall als anonymer Delegat praktischer.

    VB.NET-Quellcode

    1. BeginInvoke(New Action(Sub()
    2. 'Setz-Code
    3. End Sub))


    sofern nicht auf den Abschluss der Methode gewartet werden muss, wäre BeginInvoke praktischer, als Invoke, da dann nicht auf den Abschluss der aufgerufenen Methode gewartet, sondern schon mit der Berechnung fortgefahren wird.

    Gruß
    ~blaze~

    Cronax schrieb:

    Ich lass eine Funktion aufrufen die in einem Thread laufen soll.
    Wenn das String-Laden länger dauert, kannst Du auch pro String eine separate WebClient-Instanz anlegen:

    VB.NET-Quellcode

    1. s1.Text = wc1.DownloadString("ftp://ftp-web.ohost.de/alpasfasfasfasfg/" & item & "/s1.txt")
    2. s2.Text = wc2.DownloadString("ftp://ftp-web.ohost.de/alphatroasfasfg/" & item & "/s3txt")
    3. s3.Text = wc3.DownloadString("ftp://ftp-web.ohost.de/alphaasfasfg/" & item & "/s3.txt")
    4. s4.Text = wc4.DownloadString("ftp://ftp-web.ohost.de/alasfasf/" & item & "/s2.txt")
    5. s5.Text = wc5.DownloadString("ftp://ftp-web.ohost.de/alphasfasfasf/" & item & "/s5.txt")
    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!
    Ist das effizienter?
    Es dauert im Moment wirklich lange knapp 20 Label zu texten damit....
    Kommt es nicht am Ende aufs selbe hinaus, ich mein wenn die selbe Instanz mit dem s1-Text fertig ist, dann macht es das nächste...
    Wenn ich es mit verschiedenen Instanzen mache, dann dauert es doch genau solange oder nicht?
    Wie lang sind denn die Dateien?
    Ich denke mal, wenn Du die synchron lädtst, kannst Du das in eine Schleife packen und gut.
    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!
    Da ist doch die Kommunikation das längste, das Laden der einentlichen Information ist vernachlässigbar.
    Probier einfach mal das synchrone Laden aus.
    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!