none
Backgroundworker was tun wenn dieser Fehlerhaft abbricht? RRS feed

  • Allgemeine Diskussion

  • Hi zusammen, ich rufe mit einem Backgroundworker eine zeitaufwendige Funktion auf.

       Me.BackgroundWorker1.RunWorkerAsync(&H7D0)

                Do While Mein_Task = False
                Loop

    Ich warte mit Mein_Task bis die Routine im Backgroundworker fertig ist. Und mache mit meinem Programm weiter.
    In der BackgroundWorker1_DoWork Funktion setze ich wenn die Routine durchgelaufen ist
    Mein_Task = True.

    Nur kann es sein das durch irgendwelche Sachen die zeitaufwendige Funktion crasht und er nie Mein_Task=True setzt.

    Wie könnte ich das hinbekommen das das klappt?

    ------------------------------------

    Ausserdem will er den Progressbar nicht anzeigen, obwohl ich folgendes im Code habe

      Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
            Me.PBBarSingle.Step = 1
            Me.PBBarSingle.PerformStep()
            Me.Refresh()
        End Sub

       objBackgroundworker.ReportProgress(CInt(Math.Round(CDbl(nAnzahlDatensaetze) / CDbl(nZaehler))))

    Der Progressbar läuft erst immer komplett hoch, wenn der Backgroundworker fertig durchgelaufen ist.

    Mittwoch, 5. Dezember 2012 12:20

Alle Antworten

  • Hi Thomas,

    hier im Beispiel wird der BackgroundWorker mit einem Progressbar verwendet.

    Auf den erst Blick wirkt aber dein Aufruf korrekt. Ich weiß aber nicht wo du ReportProgress aufrufst.

    Was das setzten der Variabel Meine_Task angeht, hier kommt es darauf an wie der BackgroundWorker abgebrochen wir. Wenn es durch eine Exception ist kannst du natürlich die Exception abfangen im Catch-Block, die Variable ändern. Eine andere Möglichkeit wäre im RunWorkerCoplete Event.

    Für mich sieht es bei deinen kurzen Code Beispiel oben aber so aus als ob du dort einfach, das IsBusy Property abragen kannst.

    MFG

    Björn
    Mittwoch, 5. Dezember 2012 14:33
  • Hallo,

    erstmal zu der Progressbar: Das ProgressChanged-Event wird erst dann aufgerufen, wenn sich der Process des Backgroundworkers ändert, in diesem Fall also wenn er fertig ist. Du musst aus dem Backgroundworker heraus in bestimmten abständen deinen ProgressBar erhöhen. Woher soll deine Anwendung denn wissen, wann wie viel Fortschritt ist?

    In einer Do-Loop-Schleife zu warten bis der Computer fertig ist ist sinnlos. Es frist nur sinnlos Resourcen. Benutze lieber das von Palin vorgschlagene RunWorkerCoplete Event.

    Abfangen würde ich den Fehler aber auch in einem Try-Catch-Block. Was genau tritt denn überhaupt für ein Fehler auf?

    Es kann auch schon sein, das dei DoLoop deine CPU einfach mal überfordert und die Shleife viel zu oft durchläuft, wodurch für deinen 2. Thread keine Rechenleistung mehr übrig bleibt und vlt. etwas schief geht.


    Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/

    Mittwoch, 5. Dezember 2012 15:16
    Moderator
  • Hi,

    Hi zusammen, ich rufe mit einem Backgroundworker eine zeitaufwendige Funktion auf.

       Me.BackgroundWorker1.RunWorkerAsync(&H7D0)

                Do While Mein_Task = False
                Loop

    Ich warte mit Mein_Task bis die Routine im Backgroundworker fertig ist. Und mache mit meinem Programm weiter.

    und warum tust Du das? Das ist auch schon dann ziemlich sinnlos, wenn man keinen BackgroundWorker verwendet, aber erst recht, wenn man einen verwendet.

    Schmeiß das raus, dann sollte der Rest von alleine klappen. Zur Erkennung des Abschlusses haben dir Palin und Koopakiller ja schon alles geschrieben.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 5. Dezember 2012 21:50
    Moderator
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 14. Dezember 2012 09:15
    Moderator