problem bei arbeiten mit backgroundworker

  • VB.NET

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

    problem bei arbeiten mit backgroundworker

    hey all,

    ich versuche gerade ein programm zu schreiben, was rausfindet ob ein webproxy "surfbar" ist oder nicht.
    das habe ich soweit auch alles hinbekommen.
    jetzt möchte ich aber gerne mal mit dem backgroundworker arbeiten, da man auch eine liste mit webproxys laden kann, die dann der reihe nach getestet werden.

    ich habe eine sub, wo mit einem httpwebrequest der proxy getestet wird, wenn der test erfolgreich war möchte ich das die webproxydaten in eine listbox eingetragen werden.
    und da liegt das problem, ich kann ja nicht am ende einfach "listbox.items.add(proxydaten) machen wenn der test erfolgreich war, da das ja im anderen thread geöffnet wurde.

    wie kann ich das sonst machen ?

    hoffe ihr habt ne idee

    mfg und danke
    versteh ich ehrlich gesagt nicht wirklich...

    ich habe in der sub eine for schleife, die eine liste mit webproxys abarbeitet, wenn ein webproxy "surfbar" ist, sollen die daten in eine listbox eingefügt werden.
    nur das geht nicht, wenn das sub als thread ausgeführt wird.

    mfg hoffe ich habe mich richtig ausgedrückt
    Nun gut ...

    VB.NET-Quellcode

    1. Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
    2. For i As Integer = 0 To proxies.Count - 1
    3. 'dein code der herausfindet ob ein proxy funktioniert
    4. If proxy = True Then
    5. bgw.ReportProgress(proxies(i))
    6. End If
    7. Next
    8. End Sub
    9. Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
    10. listbox.items.add(proxies(e.ProgressPercentage))
    11. End Sub


    Du benötigst dann noch

    VB.NET-Quellcode

    1. bgw.WorkerReportsProgress = True

    damit der BackGroundWorker mitteilen kann, ob ein Proxy funktioniert... kannste z.B. in das Form Load Event reinschreiben.
    hey,
    ja genau so hab ich das eigentlich auch gemacht, wie gesagt bei mir ist das problem, das in der sub die mit dem backgroundworker aufgerufen wird, eine listbox befüllt werden soll und das haut nicht hin.
    ich bekomme da immer einen fehler.

    "ungültiger threadübergreifender vorgang: der zufriff auf das steuerelemnt listbox1 erfolgte in einem anderen thread als dem thread, für den es gestartet wurde"

    mfg
    das gibt es öfters
    schreib das ganze mal als neuen Thread (System.Threading)
    ein BackgroundWorker basiert im Prinzip auf einem Thread aber manchmal macht es einen Unterschied welchen du benutzt

    oder andere Lösung
    mach eine List Of String und adde da die ganzen Sachen und danach die ganze Liste der Listbox
    hab grad kein VS 2008 hier aber ein bischen Pseudo schadet ja nie:

    Quellcode

    1. Öffentliche Liste von Texten : TextListe
    2. Hintergrundarbeiter : BGW
    3. ListenKarton : LB
    4. Prozedur Haupt
    5. TextListe leeren
    6. LB ihm seine Liste leeren
    7. BGW starten
    8. Ende
    9. Prozedure BGW_Macht_was
    10. TextListe iwas hinzufügen
    11. Ende
    12. Prozedure BGW_is-feddisch
    13. LB's Liste mit dem Array der TextListe füllen // TextListe.ToArray ... kleiner Tipp
    14. Ende

    wie man eigene Threads macht ist sicher hier im Forum beschrieben worden


    Edit: P4ym4n's Edit im Prinzip

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

    Mangafreak1995 schrieb:

    Quellcode

    1. Solange BGW am Arbeiten ist nix // endlos Schleife die einfach nix machts solange der BGW läuft

    Sorry, aber das ist dämlich.
    Du lagerst in deinem Beispiel die lange dauernde Tätigkeit aus, damit das UI nicht einfriert. Nachdem du die Tätigkeit in einem Extrathread gestartet hast, wartest du im UI-Thread mit einer Schleife auf das Ende des BgW (Busy Waiting). Damit ist das UI gerade wieder blockiert und es tut nichtmal was sinnvolles, es lastet nur den Prozessor aus.
    Wenn man das UI mit den Ergebnissen des BgW ändern möchte, dann tut man das im RunWorkerCompleted-Ereignis.

    Viele Grüße, Phil.
    stimmt ... das gibts auch noch
    ich war mir nicht sicher ... jop da hast du Recht

    aber da wir beide ja jetzt was vernünftiges gepostet haben sollte es dem TM nicht schwer fallen das Problem zu lösen
    danke leute,

    für die die es interessiert habe das problem durch eure hilfe jetzt wie folgt gelöst.

    habe global eine list(of string) deklariert, die im backgroundworker befüllt wird, dann habe ich im RunWorkerCompleted event die list(of string) ausgelesen und in die listbox geschrieben.

    so klappts !

    mfg und danke
    dann ist doch gut :) ... dann klick bitte auf "Als Erledigt markieren"

    @YaPh1l : *high5*