web-dev-qa-db-de.com

Erstellen von Threads - Task.Factory.StartNew vs neuer Thread ()

Ich lerne gerade über die neuen Threading- und Parallel-Bibliotheken in .Net 4

In der Vergangenheit würde ich so einen neuen Thread erstellen (als Beispiel):

DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();

Jetzt kann ich machen:

Task t = Task.Factory.StartNew(() =>
{
   ThreadProcedure();
});

Was ist der Unterschied, wenn überhaupt?

Vielen Dank

97
Jon

Es gibt einen großen Unterschied. Aufgaben werden im ThreadPool geplant und können bei Bedarf sogar synchron ausgeführt werden.

Wenn Sie lange im Hintergrund arbeiten, sollten Sie dies mit der richtigen Aufgabenoption angeben.

Sie sollten Task Parallel Library der expliziten Thread-Verarbeitung vorziehen, da diese mehr optimiert ist. Sie haben auch mehr Funktionen wie Fortsetzung.

77
sanosdole

Die Aufgabe gibt Ihnen die Güte der Aufgaben-API:

  • Fortsetzungen hinzufügen (Task.ContinueWith)
  • Warten auf den Abschluss mehrerer Aufgaben (entweder alle oder alle)
  • Fehler in der Aufgabe erfassen und später abfragen
  • Capture-Stornierung (und Sie können die Stornierung zu Beginn festlegen)
  • Potentiell einen Rückgabewert haben
  • Verwendung von waitit in C # 5
  • Bessere Kontrolle über die Planung (wenn dies lange dauert, sagen Sie dies beim Erstellen der Aufgabe, damit der Aufgabenplaner dies berücksichtigen kann)

Beachten Sie, dass Sie in beiden Fällen Ihren Code mit Methodengruppenkonvertierungen etwas vereinfachen können:

DataInThread = new Thread(ThreadProcedure);
// Or...
Task t = Task.Factory.StartNew(ThreadProcedure);
72
Jon Skeet

Im ersten Fall starten Sie einfach einen neuen Thread, während Sie im zweiten Fall in den Thread-Pool einsteigen.

Der Thread Pool Job soll Threads gemeinsam nutzen und wiederverwenden. Dadurch können Sie nicht jedes Mal ein paar Millisekunden verlieren, wenn Sie einen neuen Thread erstellen müssen. 

Es gibt mehrere Möglichkeiten, den Thread-Pool aufzurufen:

  • mit derTPL(Task Parallel Library) wie Sie
  • durch Aufruf von ThreadPool.QueueUserWorkItem
  • durch Aufruf von BeginInvoke bei einem Delegierten 
  • wenn Sie einen BackgroundWorker verwenden
12
alexandrekow

Ihr erster Codeblock weist CLR an, einen Thread (z. B. T) für Sie zu erstellen, der als Hintergrund ausgeführt werden kann (verwenden Sie Thread-Pool-Threads, wenn Sie T planen). Kurz gesagt, bitten Sie CLR explizit, einen Thread zu erstellen, damit Sie etwas tun können, und rufen die Start () - Methode auf, um den Thread zu starten.

Ihr zweiter Codeblock tut dasselbe, delegiert jedoch implizit die Verantwortung für das Erstellen eines Threads (Hintergrund, der erneut im Thread-Pool ausgeführt wird) und den Start-Thread durch die StartNew-Methode in der Task Factory-Implementierung.

Dies ist ein schneller Unterschied zwischen den angegebenen Codeblöcken. Allerdings gibt es wenige detaillierte Unterschiede, die Sie googeln oder andere Antworten von meinen Mitwirkenden sehen können.

0
s_nair