Ich lerne gerade etwas über die neuen Threading- und Parallel-Bibliotheken in .Net 4
In der Vergangenheit habe ich so einen neuen Thread erstellt (als Beispiel):
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();
Jetzt kann ich tun:
Task t = Task.Factory.StartNew(() =>
{
ThreadProcedure();
});
Was ist der Unterschied, wenn überhaupt?
Vielen Dank
Antworten:
Es gibt einen großen Unterschied. Aufgaben werden auf dem ThreadPool geplant und können bei Bedarf sogar synchron ausgeführt werden.
Wenn Sie eine lange laufende Hintergrundarbeit haben, sollten Sie diese mithilfe der richtigen Task-Option angeben.
Sie sollten die Task Parallel Library der expliziten Thread-Behandlung vorziehen, da sie optimierter ist. Sie haben auch mehr Funktionen wie Fortsetzung.
quelle
Die Aufgabe bietet Ihnen alle Vorteile der Aufgaben-API:
Task.ContinueWith
)Beachten Sie, dass Sie in beiden Fällen Ihren Code mit Methodengruppenkonvertierungen etwas einfacher gestalten können:
quelle
Thread
im Vergleich zu sehr niedrig istTask
(ich habe einen Blog-Beitrag , der ins Detail geht). Ich halte beim Grand Rapids DevDay einen Vortrag über "Aufgaben in der realen Welt verwenden" . Der Vortrag heißt "Thread is Dead", da dies nicht mehr erforderlich istThread
(es sei denn, Sie implementieren aTaskScheduler
).Thread
ist tot, wenn es darum geht, als Hintergrund-Thread verwendet zu werden?Thread
kann (oder kannBackgroundWorker
) .Task
TaskScheduler
Thread
?Task
, dass a auf einem bestimmten Thread ausgeführt wird, verwenden Sie einen geeigneten Thread,TaskScheduler
zAsyncContextThread
. Dies ist jedoch normalerweise nicht erforderlich. dieSynchronizationContext
,ThreadPool
undConcurrentExclusiveSchedulerPair
Disponenten sind für die meisten Programme ausreichend.Im ersten Fall starten Sie einfach einen neuen Thread, während Sie im zweiten Fall in den Thread-Pool eintreten.
Der Thread-Pool- Job besteht darin, Threads freizugeben und zu recyceln. So können Sie vermeiden, dass jedes Mal, wenn wir einen neuen Thread erstellen müssen, einige Millisekunden verloren gehen.
Es gibt verschiedene Möglichkeiten, in den Thread-Pool einzutreten:
quelle
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, Sie fordern CLR ausdrücklich auf, einen Thread zu erstellen, damit Sie etwas tun können, und rufen die Start () -Methode für den Thread auf, um zu starten.
Ihr zweiter Codeblock macht dasselbe, delegiert jedoch (implizit Handover) die Verantwortung für das Erstellen eines Threads (Hintergrund - der wiederum im Thread-Pool ausgeführt wird) und des Startthreads über die StartNew-Methode in der Task Factory-Implementierung.
Dies ist ein schneller Unterschied zwischen bestimmten Codeblöcken. Trotzdem gibt es nur wenige detaillierte Unterschiede, die Sie googeln oder andere Antworten meiner Mitwirkenden sehen können.
quelle