50 Stimmen

Thread.Start() versus ThreadPool.QueueUserWorkItem()

Die Microsoft .NET Base Class Library bietet mehrere Möglichkeiten, einen Thread zu erstellen und zu starten. Grundsätzlich ist der Aufruf sehr ähnlich zu jedem anderen, der die gleiche Art von Dienst bereitstellt: Erstellen Sie ein Objekt, das einen Ausführungsablauf (oder mehrere) repräsentiert, weisen Sie ihm einen Delegaten zu, der den auszuführenden Ausführungsablauf repräsentiert, und schließlich, abhängig von der Signatur des Delegaten, ein Objekt als Parameter.

Nun, es gibt (im Wesentlichen) zwei Ansätze:

1) Mit dem System.Threading.Thread Klasse.

Thread curr = new Thread(myfunction); /* In a class, myfunction is a void taking an object */
curr.Start(new Object()); /* Or something else to be downcast */

2) Mit Hilfe des System.Threading.ThreadPool Klasse.

ThreadPool.QueueUserWorkItem(myfunction, new Object()); /* Same philosophy here */

Gibt es besondere Gründe, warum ich 1) oder 2) verwenden sollte?

  • Leistungsgründe?
  • Muster?
  • Was ist der beste Ansatz?

Ich habe das Gefühl, dass die Antwort lautet: "Es kommt auf die Situation an". Könnten Sie bitte einige Situationen nennen, in denen ein Ansatz besser ist als ein anderer?

0 Stimmen

1voto

Tomas Voracek Punkte 5801

ThreadPool.QueueUserWorkItem() ist im Wesentlichen für Fire-and-Forget-Szenarien gedacht, wenn die Anwendung nicht davon abhängt, ob die Vorgänge abgeschlossen werden oder nicht.

Verwenden Sie klassische Threads für eine feinkörnige Steuerung.

1voto

sotn Punkte 3733

Sie sollten Folgendes verwenden ThreadPool.QueueUserWorkItem außer in Fällen von:

  • Sie benötigen einen Vordergrund-Thread.

  • Sie verlangen, dass ein Thread eine bestimmte Priorität hat.

  • Sie haben Aufgaben, die dazu führen, dass der Thread für lange Zeiträume blockiert Zeit blockiert. Der Thread-Pool hat eine maximale Anzahl von Threads, so dass eine große Anzahl von blockierten Threads im Thread-Pool kann den Start von Aufgaben starten.

  • Sie müssen Threads in einer Single-Thread-Wohnung platzieren. Alle ThreadPool-Threads befinden sich in der Multithreading-Wohnung.

  • Sie benötigen eine stabile Identität, die mit dem Thread verbunden ist, oder Sie müssen einen Thread einer Aufgabe zuzuordnen.

Referenz Link .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X