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

57voto

Brian Rasmussen Punkte 112118

Das Anlegen eines neuen Fadens kann sehr kostspielig sein. Der Thread-Pool verwendet Threads wieder und amortisiert so die Kosten. Sofern Sie keinen eigenen Thread benötigen, ist der Thread-Pool die empfohlene Lösung. Durch die Verwendung eines dedizierten Threads haben Sie mehr Kontrolle über Thread-spezifische Attribute wie Priorität, Kultur und so weiter. Außerdem sollten Sie keine lang laufenden Aufgaben im Thread-Pool ausführen, da dies den Pool zwingt, zusätzliche Threads zu erzeugen.

Zusätzlich zu den von Ihnen erwähnten Optionen bietet .NET 4 einige großartige Abstraktionen für Gleichzeitigkeit. Sehen Sie sich die Task- und Parallel-Klassen sowie alle neuen PLINQ-Methoden an.

13voto

Jim Mischel Punkte 125706

Der verwaltete Thread-Pool hat einige sehr gute Richtlinien darüber, wann man den Threadpool NICHT verwenden sollte.

Meiner Erfahrung nach sollten Sie einen eigenen Thread erstellen, wenn Sie einen dauerhaften, dedizierten, lang laufenden Thread benötigen. Für alles andere sollten Sie asynchrone Delegierte oder etwas wie QueueUserWorkItem , BackgroundWorker oder die aufgabenbezogenen Funktionen von .NET 4.0.

7voto

Steel Punkte 125

Threads im ThreadPool sind Hintergrundthreads; Alle Threads, die durch ein neues Thread-Objekt erstellt und gestartet werden, sind Vordergrund-Threads.

Ein Hintergrund-Thread hält die verwaltete Ausführungsumgebung nicht am Laufen.

beziehen sich auf http://msdn.microsoft.com/en-us/library/h339syd0.aspx für mehr.

7voto

dana Punkte 15935

In .NET 4.5.2 wurde eine neue Methode hinzugefügt: HostingEnvironment.QueueBackgroundWorkItem .

Dies scheint eine Alternative zu sein zu ThreadPool.QueueUserWorkItem . Beide verhalten sich ähnlich, aber die neue Methode bietet bei der Arbeit in ASP.NET einige Vorteile:

Mit der Methode HostingEnvironment.QueueBackgroundWorkItem können Sie kleine Hintergrund-Workitems planen. ASP.NET verfolgt diese Elemente und verhindert, dass IIS den Arbeitsprozess abrupt beendet, bis alle Hintergrundarbeitselemente abgeschlossen sind. Diese Methode kann nicht aufgerufen werden außerhalb einer von ASP.NET verwalteten Anwendungsdomäne aufgerufen werden.

2voto

Bueller Punkte 2280

Wenn Sie den ThreadPool verwenden, haben Sie weniger Kontrolle über das Threading-System. Dies ist ein Kompromiss, um den Prozess für Sie zu vereinfachen. Wenn Sie mit dem ThreadPool alles haben, was Sie brauchen, können Sie ihn ruhig nutzen. Wenn Sie mehr Kontrolle über die Threads benötigen, müssen Sie natürlich die Thread-Klassen verwenden.

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