Announcement

Collapse
No announcement yet.

BackGroundWorker

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • BackGroundWorker

    Hallo zusammen,
    ich möchte zwei BackGroundWorker parallel laufen lassen. Aber erst wenn beide fertig sind die nächste Operation durchführen...
    Ich hab hier mal nen paar Codezeilen, kann man das so machen oder gibt`s dafür einen bessere Lösungsweg ?

    [highlight=vbnet]W1 =False
    W2 = False
    MyWorker1RunWorkerAsync()
    MyWorker2RunWorkerAsync()

    Do
    Application.DoEvents()
    loop until W1 = True and W2 = True

    '....Weiter mit Code
    [/highlight]

    [highlight=vbnet]
    Private Sub MyWorker1_Completed(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    ContactBindinSourceDo.RaiseListChangedEvents = True
    W1= True
    End Sub

    Private Sub MyWorker2_Completed(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    ContactBindinSourceDo.RaiseListChangedEvents = True
    W2= True
    End Sub
    [/highlight]

    Wie sieht das aus, wenn ein Worker auf Fehler läuft, wird dann trotzdem Completed ausgelöst. Oder muss ich da noch irgenwo Code einbrigen, damit ich den entsprechenden Flag auf True setze.

    An welcher Stelle müsste ich das dann tun ?
    Zuletzt editiert von gfoidl; 07.11.2008, 12:16. Reason: kein Text

  • #2
    ich sehe nichts von deinen Codezeilen es sei denn das was du da hast ist alles.

    Ich würde einfach das Event das sagt das der Worker fertig ist abfangen und damit einen Boolschen wert setzen bei beiden. Und dann damit eine Function aufrufen, die beide Bools als Parameter hat. So wenn der erste Fertig ist ist nur ein Wert true und die Function wird beendet. Wird der zweite BGW fertig wird auch der zweite Bool wert true und die Function kann anlaufen.

    [highlight=vbnet]

    Dim BGW1 as boolean = false
    dim BGW2 as boolean = false

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    BGW1 = True
    afterBWG(BGW1,BGW2)
    End Sub

    Private Sub BackgroundWorker2_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    BGW2 = True
    afterBWG(BGW1,BGW2)
    End Sub

    Private Sub afterBGW(Byval w1 as Boolean, Byref w2 as Boolean)
    if w1 and w2 then
    'Deine Codezeilen nach Beendigung beider Worker
    else
    debug.writeline("Im Moment haben noch nicht beide Backgroundworker ihre Arbeit abgeschlossen")
    end if
    End Sub
    [/highlight]

    so sollte es eigentlich funktionieren und du kommst ohne einer wartenden Endlosschleife aus. Du könntest natürlich auch ein Event auslösen aber das würde in diesem Fall ein ähnliches oder eigetnlich gleiches Ergebnis herbeiführen.
    Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

    Comment


    • #3
      Sieh dir einfach mal das Beispiel zur RunWorkerAsync Methode in der MSDN an.

      Comment


      • #4
        Hallo zusammen,
        momisch hier ist mein Text nicht vollständig...

        Edit Moderator:
        ...es ist ein zweiter Thread mit dem gleichen Thama offen, wo der richtige Text drin steht...
        bitte weitere Posts in den anderen Thread schreiben....
        http://entwickler-forum.de/showthread.php?t=52046

        hab die beiden Beiträge zusammengeführt


        Danke
        Zuletzt editiert von gfoidl; 07.11.2008, 12:12.

        Comment


        • #5
          @Ralf Jansen

          OK.

          Code:
           While Me.backgroundWorker1.IsBusy
                  ' Keep UI messages moving, so the form remains 
                  ' responsive during the asynchronous operation.
                  Application.DoEvents()
              End While
          Aber macht das so Sinn, wenn ich da zwei Worker parallel laufen lasse..?

          Comment


          • #6
            Aber macht das so Sinn, wenn ich da zwei Worker parallel laufen lasse..?
            Die Sinnhaftigkeit kann ich jetzt nicht beantworten benutze den Backgroundworker nicht sondern benutze Threads pur. Aber du kannst einfach die Bedingung der While-Schleife einfach auf den 2.Backgroundworker erweitern und beide auf IsBusy prüfen.

            Comment


            • #7
              Hintergrundinfos:
              http://msdn.microsoft.com/de-de/library/1c9txz50.aspx

              benutze den Backgroundworker nicht sondern benutze Threads pur.
              Mach ich auch so, denn hier hab ich mehr Kontrolle über die Threads zB wie diese synchronisiert werden, wann beide fertig sind, etc.

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Eine Klasse zur Parallelisierung findet sich unter http://dotnet-snippets.de/dns/parall...n-SID1009.aspx

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  OK.


                  Das muss ich mir mal in Ruhe ansehen....
                  ...habe gleich Feierabend...



                  Melde mich dann am Montag in alter Frische

                  Comment


                  • #10
                    Moin, Moin
                    ich wollte gerade dein Beispiel mal genauer ansehen...
                    ... da ich im C# nicht so fit bin, habe ich mir das auf der Seite

                    http://www.developerfusion.com/tools.../csharp-to-vb/

                    übersetzten lassen.

                    Funktioniert aber nicht... sind Fehler, wenn ich das in ein VB-Projekt einfüge...

                    Comment


                    • #11
                      nun poste uns doch die Fehler dann kann man dir vielleicht helfen.


                      Hat meine Möglichkeit nicht funktioniert?
                      Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                      Comment


                      • #12
                        Doch das würde so gehn...


                        ..da aber vom BackGroundWorker abgeraten wird und zu "echten Threads" geraten wird, wollte ich mich da etwas einlesen und testen...

                        Comment


                        • #13
                          Hallo,

                          übersetzen geht leider nicht

                          Hab im Anhang eine Klassenbibliothek des Codes. Vielleicht hilft das.

                          Zum Verstehen des Code kannst du aber die Übersetzung hernehmen.

                          mfG Gü
                          Attached Files
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment


                          • #14
                            Hallo nochmal,
                            mit MultiThreading bin ich nicht so ganz klar gekommen.
                            Aus diesem Grund habe ich mit dem BackGroundWorker weiter gemacht.

                            Ich habe ein ZipFile mit einem Beispiel angehangen.
                            Ich denke das sollte so gehn...

                            Aber, wenn ich die Stop-Button betätige laufen die BackGroundWorker noch weiter, warum...???

                            Gibt es sonst noch etwas an diesem Beispiel zu verbessern...???


                            Schon mal Danke für deine Mühe
                            Attached Files

                            Comment


                            • #15
                              Hi,

                              hab den Code kurz überflogen: "Es ist eine wilde Mischung zwischen BackgroundWorker und Threads"

                              Überdenke nochmals das was ein BackgroundWorker tut und schreibe den Code neu.

                              mfG Gü
                              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                              Comment

                              Working...
                              X