BackgroundWorker und Threads

8

Was sind die Vor- und Nachteile bei der Verwendung der entweder zum Erreichen einer bestimmten Aufgabe.

Die Million Dollar Frage ist welche zu verwenden und wann?

Vielen Dank.

    
Anand Shah 14.04.2009, 14:19
quelle

6 Antworten

3

Ich verwende BackgroundWorker als Wrapper für was Threads tun würde. Also benutze ich BackgroundWorker für GUI-Arbeiten und Threads für spezialisiertere oder schmutzige Jobs (Windows Services, etc)

    
Jhonny D. Cano -Leftware- 14.04.2009, 14:23
quelle
12

Wenn Sie unter "Threads" explizit die Klasse System.Threading.Thread verwenden, um eigene Threads zu erstellen, zu konfigurieren und zu starten, lautet die Antwort, dass dies mehr Arbeit von Ihrer Seite ist und mehr CPU-Zyklen erfordert als nur Ziehen eines Threads aus dem Thread-Pool, (was die anderen Techniken tun), aber es gibt Ihnen mehr Flexibilität, da Sie Thread-Priorität angeben können, und einige andere Eigenschaften, die Thread Thread-Threads nicht leisten können.

Der Ansatz "Thread Pool" ist besser geeignet, wenn die Anzahl der benötigten Threads zur Entwurfszeit nicht bekannt ist. Der Pool enthält anfänglich eine kleine Anzahl von Threads, die "bereit" sind, um sie aufzurufen. Es kann bei Bedarf dynamisch neue Threads erstellen und verwaltet die Erstellung, Koordination und Löschung nicht verwendeter Threads für Sie. Es gibt drei Mechanismen, mit denen Sie auf Threads aus dem Pool zugreifen und diese verwenden können.

  1. Verwenden von Delegate.BeginInvoke () (die häufigste Technik)
  2. Verwendung von Timern (verschiedene Varianten)
  3. System.Threading.ThreadPool bietet verschiedene andere Funktionen (BackGroundWorker-Klasse, QueueUserWorkItem () usw.).
Charles Bretana 14.04.2009 14:23
quelle
6

Sehen Sie sich diese großartige Themenübersicht an :

  

[Der BackgroundWorker] bietet die folgenden Funktionen:

     
  • Ein "Abbrechen" -Flag zum Signalisieren, dass ein Arbeiter ohne Abbruch beendet wurde

  •   
  • Ein Standardprotokoll für die Meldung von Fortschritt, Abschluss und Stornierung

  •   
  • Eine Implementierung von IComponent, die die Platzierung im Visual Studio Designer ermöglicht   Ausnahmebehandlung für den Arbeitsthread

  •   
  • Die Möglichkeit, Windows Forms- und WPF-Steuerelemente als Reaktion auf den Fortschritt oder Abschluss des Arbeitsprogramms zu aktualisieren.

  •   

Die letzten beiden Features sind besonders nützlich - das bedeutet, dass Sie in Ihrer Worker-Methode keinen try / catch-Block einfügen müssen und Windows Forms- und WPF-Steuerelemente aktualisieren können, ohne dass Sie Control.Invoke aufrufen müssen.

    
tanascius 14.04.2009 14:29
quelle
3

Threads nur, wenn Sie nicht mit einer Benutzeroberfläche (WinForms oder WPF) und Hintergrundarbeitern arbeiten müssen, wenn Sie sich mit einer Benutzeroberfläche beschäftigen müssen.

Sie vermeiden eine Menge von Problemen mit Benutzeroberflächen und Hintergrundarbeitern.

    
Samuel 14.04.2009 14:24
quelle
1

Die BackgroundWorker-Klasse ist eine einfache Möglichkeit, einen Thread zu einem Formular hinzuzufügen, um schwere Operationen auszuführen, ohne die Benutzeroberfläche zu blockieren. Sie könnten das gleiche mit einem Thread tun, aber mit etwas mehr Codierung.

    
Brian Ensink 14.04.2009 14:24
quelle
1

Die BackgroundWorker-Klasse stellt einfach Ereignisse zur Verfügung, die für Sie in den Kontext des UI-Threads geschaltet werden, aber verwechseln Sie sie nicht. Das DoWork-Ereignis (an dem Sie tatsächlich die Arbeit ausführen) wird immer noch im Kontext eines anderen Threads ausgeführt (da dies der Punkt der ganzen Sache ist) und jede Art von UI-Interaktion oder Aktualisierung ausführen, bei der eine Ausnahme ausgelöst wird am besten und stürzt im schlimmsten Fall ab. Der BackgroundWorker sollte in Formularen verwendet werden, wenn Sie versuchen, etwas zu tun, für das ein UI-Update erforderlich ist und dessen Umfang nicht über das Formular hinausgeht. Für andere Hintergrundoperationen sollten Sie entweder den ThreadPool verwenden (für kurzlebige Operationen) oder einen eigenen Thread erstellen.

Der BackgroundWorker bietet Bequemlichkeit mit dem ProgressChanged-Ereignis, aber nicht zu bequem und starten Sie UI-Updates in DoWork.

    
Adam Robinson 14.04.2009 14:41
quelle