BackgroundWorker erweitern

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    BackgroundWorker erweitern

    Ich verwende den BackgroundWorker, weil man mit dem sehr einfach eine bestimmte Aktion in einen anderen Thread legen kann. Nun habe ich aber folgende Frage und zwar lade ich mit dem BackgroundWorker & HttpWebRequest mehrere Dateien hintereinander herunter, nun schreib ich aber auch eine Log-Datei die im Download-Fenster angezeigt werden soll. Nun wollte ich fragen ob ich nochmal so eine Funktion ReportProgress einbauen kann, die z.B. ständig die Log-Datei an das Download-Fenster schickt.
    Ein "Guru" der sich traut Fragen zu stellen ? Extrem sympathisch ....

    Nichtsdestoweniger verstehe ich die Frage nicht ganz, wo genau liegt das Problem ?

    Ich gehe davon aus, dass der BGW syncron in einer Loop die von Dir angegebenen Dateien runterlädt.

    Wo läuft die Ausgabe der Log-Datei, Log-Messages ?

    Der Update-Worker stellt ja selber das Event "ProgressChanged" welches für solche Fälle vorhergesehen ist .

    Also mehr Informationen please ...
    Auch ich habe manchmal noch Fragen.

    Also bevor ich den BackgroundWorker starte wird das Download-Fenster angezeigt, dann wird während dem Download eine Log erstellt und diese möchte ich im Download-Fenster anzeigen. Das Event wird in der Schleife ausgelöst drum herum habe ich aber auch Sachen die ich anzeigen möchte.
    Wer hat die nicht, nur ab einem gewissen Wissensstand versuchen viele ihre Lücken zu verbergen ...

    Ich oute mich jetzt hier auch nochmal als unwissend: ich weiss immer noch nicht wo das Problem liegt !

    Liegt es in der Reihenfolge der Daten, sollen die Log-Dateien zusammenhängend im Download-Fenster erscheinen ? Solange der BGW der Einzige ist, der das Download-Fenster (auch per Event) füllt, ist die Ausgabe syncron.

    Ansonsten muss per Synclock gesperrt werden.

    Wie gesagt, mir entgeht das Problem ...
    er will glaube ich eine Art zweite ReportProgress Methode einbauen...
    und glücklicherweiße geht dies genauso wie bei einem Thread durch einen Delegaten und Invoke ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also nochmal ich habe einen BackgroundWorker in dem werden mehrere Dateien heruntergeladen. Im BackgroundWorker wird auch eine Log geschrieben, die dann im Download-Fenster angezeigt werden soll. Nun möchte ich gerne wissen, ob ich die Log an das Download-Fenster über eine Delegate übergeben kann, also nicht ProgressChanged sondern eine andere.
    Entschuldigung das ich so schnell nochmal antworte und zwar habe ich was herausgefunden. Ich hab ein Event erstellt und das lös ich mit RaiseEvent in der Sub DoWork aus und das funktioniert. Nun wollte ich euch fragen, ist das empfehlenswert oder nicht?
    nein, das ist nicht empfehlenswert, da dieses Event auch im Thread des BGWs aufgerufen wird, somit ist jeder GUI Zugriff Threadübergreifend...aber du kannst entsprechend auch mit einem Delegaten das Event aufrufen lassen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl thx, ich dachte schon ich stehe solo auf dem Schlauch :)

    Der BGW ist eine simple Vereinfachung des normalen Threads, indem er special Events (progressChanged,RunWorkerCompleted) bereitstellt, um GUI-Elemente updaten zu können. Alle anderen Methoden über Delegate.invoke funktionieren weiterhin.

    Events laufen allerdings weiterhin imselben Thread wie der BGW.

    Bei konkurrierenden Threads würde ich dann allerdings das Download-Fenster (Label, RichTextBox) über synclock sperren.
    singu tut mir leid, aber du verwirrst mich jetzt :P Du weißt doch wie man Invoke und Delegates verwendet?
    Edit: noch nen Event ;)
    also ich hätte es ca. so gesagt:

    VB.NET-Quellcode

    1. Public Event GUIUpdated()
    2. Delegate Sub UpdateGUIDel(Information1 As String,Information2 As String)
    3. Sub UpdateGUI(Information1 As String,Information2 As String)
    4. DeineForm.TextBox1.Text = Information1
    5. DeineForm.TextBox2.Text = Information2
    6. RaiseEvent GUIUpdated()
    7. End Sub
    8. Sub BackgroundWorker_DoWork(...)
    9. DeineForm.Invoke(New UpdateGUIDel(AddressOf UpdateGUI),"textbox1","textbox2")
    10. End Sub
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---