Problem mit einem Backroundworker

Peter86

Erfahrenes Mitglied
Hallo,
ich nutze einen Backroundworker um dateien zu downloaden. Nachdem eine Datei fertig ist startet der Sub download complete. Ab da will ich das das Programm wieder von vorne anfängt aber ohne es zu restarten. Ich habs folgender maßen probiert.

Code:
    Delegate Sub DownloadCompleteSafe(ByVal cancelled As Boolean)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        start()

    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

        Me.Invoke(completeDelegate, True)

    End Sub

    Public Sub DownloadComplete(ByVal cancelled As Boolean)

        start()
    End Sub

Wie man sieht ist start() der Erste sub der aufgerufen wird wenn man das Programm start. So hab ich dann also versucht das das Programm von vorne anfängt zu arbeiten. Doch leider krieg ich bei der "lösung", nachdem 2ten aufrufen des backroundworkers, folgende meldung
Code:
Dieser BackgroundWorker ist derzeit ausgelastet und kann nicht mehrere Aufgaben gleichzeitig ausführen.
bei folgender code zeile
Code:
 Me.Invoke(completeDelegate, True)

Aber eigentlich ist doch der Backroundworker bei DownloadComplete fertig? Naja ich weiß nicht mehr weiter deswegen wende ich mich an euch. Ich hoffe ihr könnt mir helfen.

Peter86
 
Zuletzt bearbeitet:
Hi

Ruf vor dem erneuten Starten die Methode Dispose auf um die nichtverwalteten Ressourcen freizugaben. Anschließend kannst du den BackgroundWorker neu instantiieren und mit ihm weiterarbeiten
 
Mit der einen Codezeile wollte ich nur zeigen mit welchen code ich das gemacht habe in dem Falle BW1.Dispose, wie du gesagt hattest. Doch leider ergab sich daraus kein erfolg.
Ich habe mir das mit der Instance mal angesehn, doch leider war ich noch nie soweit das zu benutzen, könntest du mir sagen wie ich das zu benutzen habe?

Peter86
 
BackgroundWorker hat doch ein eigenes RunWorkerComplete Ereignis.
Dort dann einfach wieder RunWorkerAsync aufrufen.

Edit:
Warum nicht direkt im DoWork eine Art Endlosschleife laufen lassen?
 
Warum nicht direkt im DoWork eine Art Endlosschleife laufen lassen?

Weil das tool von vorne anfangen muss zu arbeiten, denn wenn man das programm startet liest das programm daten aus einer file herraus, dann fängt der BW an zu arbeiten. Wenn er fertig ist wird die gedownloadete file entpackt ( .zip ). Danach muss er von vorne anfangen, weil die daten in der file sich geändert haben und er die neue laden muss, danach soll wieder der backroundworker anfangen zu arbeiten. Daran scheiter ich.


Peter86
 
Ähm, du programmierst mit mehreren Threads und willst mir sagen, dass du noch nie den Konstruktor einer Klasse aufgerufen hast :confused:
Code:
BackgroundWorker1 = New BackgroundWorker()
 
Es klappt nich egal wie ichs mache :(.
Ich mach einfach mal ein Beispiel, nehmen wir an mein Code würde folgendermaßen aussehen:
Code:
Delegate Sub DownloadCompleteSafe(ByVal cancelled As Boolean)

    Private Sub zip(ByVal path As String)

        Dim fz As New FastZip()
        fz.ExtractZip(path, "", "")
        BackgroundWorker1.RunWorkerAsync()

    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork


        Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)

        Me.Invoke(completeDelegate, True)

    End Sub

    Public Sub DownloadComplete(ByVal cancelled As Boolean)

        zip("datei.zip")
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        zip("datei.zip")
    End Sub
Wie müsste der Code aussehen damit es funktioniert?

Peter86
 
Zuletzt bearbeitet:
[Wiederholung]Nutze das Haus eigene RunworkerComplete Ereignis[/Wiederholung]
Das EventArgs des DoWorks hat eine Eigenschaft Result die kannst du setzen und im RunworkerComplete abfragen.
(Edit, sehe grad du hast ja eh kein Result, also kannst du die Eigenschaft erstmal außer acht lassen)

Im RunworkerComplete rufst du dann wieder deine zip Methode auf.
 

Neue Beiträge

Zurück