BackgroundWorker

Hi!

Ich nutze zur Zeit den BackgroundWorker und habe da ein kleines Problem. Wenn die DoWork Methode abgearbeitet ist wird das RunWorkerCompleted Event gefeuert. Manchmal stosse ich aber mit der DoWork Methode weitere Methoden an (z.B. Timer) die dann weiter arbeiten, so dass RunWorkerCompleted Event zu früh feuert. Klar, ich kann in den EventArgs entsprechend Daten hinterlegen und daraus weitere Entscheidungen treffen, geschickter wäre es aber RunWorkerCompleted Event erst gar nicht feuern zu lassen. Weiss jemand wie man das macht? Ich habe schon versucht die BackgroundWorker Methoden abzuleiten, aber auch da wird das Event gefeuert.

Sebo

Hi!

Auch wenn es vielleicht möglich ist, so von BackgroundWorker abzuleiten, dass RunWorkerCompleted NICHT gefeuert wird, halte ich das Vorgehen für nicht sinnvoll.

Das Ereignis wird genau dann ausgelöst, wenn die Bedingung erfüllt ist (also die Threadprozedur abgearbeitet ist). Hieran zu drehen ändert die Semantik des Ereignisses, und das sollte man unterlassen.

Wenn Dich unter bestimmten Bedingungen das Ereignis nicht interessiert, dann steht es Dir frei, keinen EventHandler damit zu verknüpfen oder einen eingehängten EventHandler wieder zu entfernen.

Falls Du aus Deiner ThreadProzedur weitere Threads startest und auch noch auf die Beendigung dieser Threads warten möchtest, dann schau’ Dir mal Thread.Join an, darüber kann man Threads zusammenführen/synchronisieren.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

Auch wenn es vielleicht möglich ist, so von BackgroundWorker
abzuleiten, dass RunWorkerCompleted NICHT gefeuert wird, halte
ich das Vorgehen für nicht sinnvoll.

Warum?

Das Ereignis wird genau dann ausgelöst, wenn die Bedingung
erfüllt ist (also die Threadprozedur abgearbeitet ist). Hieran
zu drehen ändert die Semantik des Ereignisses, und das sollte
man unterlassen.

Ebenfalls warum? Klar ändert man die Semantik damit, aber wenn es erwünscht ist? Wenn man ableitet wird immer irgendeine Semantik geändert, das ist der Sinn einer Ableitung und das ist einer der Hauptbestandteile der OOP und die wird wohl keiner in Frage stellen wollen. :wink:

Wenn Dich unter bestimmten Bedingungen das Ereignis nicht
interessiert, dann steht es Dir frei, keinen EventHandler
damit zu verknüpfen oder einen eingehängten EventHandler
wieder zu entfernen.

Gute Idee, aber nicht realisierbar, denn wenn alles abgearbeitet ist soll das Event gefeuert werden. KLar, einen neuen Eventhandler schreiben wäre eine Idee, aber warum, es gibt doch schon einen, der genau das tut was ich will, eben nur nicht immer zum richtigen Zeitpunkt.

Falls Du aus Deiner ThreadProzedur weitere Threads startest
und auch noch auf die Beendigung dieser Threads warten
möchtest, dann schau’ Dir mal Thread.Join an, darüber
kann man Threads zusammenführen/synchronisieren.

Ich selber starte keine neuen Threads, ich lasse einfach noch ein paar Dinge abarbeiten im selben Thread wie der Worker selbst. Aber trotzdem danke für den Tip, den kannte ich noch nicht und kann ihn aber wo anders brauchen. :smile:

Tja, wenn keiner eine Idee hat, muss ich wohl damit leben und in den EventArgs entsprechend was übergeben und auslesen. :smile:

Sebo