In C # 4.0 haben wir Task
im System.Threading.Tasks- Namespace. Was ist der wahre Unterschied zwischen Thread
und Task
. Ich habe ein Beispielprogramm (Hilfe von MSDN) durchgeführt, um selbst zu lernen
Parallel.Invoke
Parallel.For
Parallel.ForEach
aber habe viele Zweifel, da die Idee nicht so klar ist.
Ich habe ursprünglich in Stackoverflow nach einer ähnlichen Art von Frage gesucht, aber möglicherweise konnte ich mit diesem Fragentitel nicht dieselbe bekommen. Wenn jemand weiß, dass dieselbe Art von Frage früher hier veröffentlicht wurde, geben Sie bitte den Verweis auf den Link an.
c#
multithreading
c#-4.0
task-parallel-library
terminology
Hippietrail
quelle
quelle
Antworten:
Eine Aufgabe ist etwas, das Sie erledigen möchten.
Ein Thread ist einer der vielen möglichen Arbeiter, die diese Aufgabe ausführen.
In .NET 4.0-Begriffen repräsentiert eine Aufgabe eine asynchrone Operation. Threads werden verwendet, um diesen Vorgang abzuschließen, indem die Arbeit in Blöcke aufgeteilt und separaten Threads zugewiesen wird.
quelle
In der Informatik
Task
ist a eine Zukunft oder ein Versprechen . (Einige Leute verwenden diese beiden Begriffe synonym, andere verwenden sie unterschiedlich, niemand kann sich auf eine genaue Definition einigen .) Grundsätzlich einTask<T>
"Versprechen", Ihnen einen zurückzugebenT
, aber momentan nicht, Schatz, ich bin ein bisschen beschäftigt, warum nicht kommst du später zurückA
Thread
ist ein Weg, dieses Versprechen zu erfüllen. Aber nicht jederTask
braucht einen brandneuenThread
. (Tatsächlich ist das Erstellen eines Threads oft unerwünscht, da dies viel teurer ist als die Wiederverwendung eines vorhandenen Threads aus dem Threadpool. Mehr dazu gleich.) Wenn der Wert, auf den Sie warten, aus dem Dateisystem stammt oder a Datenbank oder das Netzwerk, dann muss kein Thread herumstehen und auf die Daten warten, wenn andere Anforderungen bearbeitet werden können. StattdessenTask
registrieren sie möglicherweise einen Rückruf, um die Werte zu erhalten, wenn sie bereit sind.Insbesondere
Task
sagt das nicht aus , warum es so lange dauert, bis der Wert zurückgegeben wird. Es kann sein, dass das Berechnen lange dauert, oder dass das Abrufen lange dauert. Nur im ersteren Fall würden Sie a verwenden, um aThread
auszuführenTask
. (In .NET sind Threads verdammt teuer, daher möchten Sie sie im Allgemeinen so weit wie möglich vermeiden und sie wirklich nur verwenden, wenn Sie mehrere umfangreiche Berechnungen auf mehreren CPUs ausführen möchten. In Windows wiegt ein Thread beispielsweise 12 KiByte ( Ich denke), unter Linux wiegt ein Thread nur 4 KiByte, in Erlang / BEAM sogar nur 400 Byte. In .NET ist es 1 MiByte!)quelle
Task
. Diese 400 Bytes beziehen sich auf etwas Ähnliches wie .NETs .Faden
Das Bare-Metal-Ding, das Sie wahrscheinlich nicht benötigen, können Sie wahrscheinlich eine
LongRunning
Aufgabe verwenden und die Vorteile der TPL - Task Parallel Library nutzen, die in .NET Framework 4 (Februar 2002) und höher (auch .NET) enthalten ist Ader).Aufgaben
Abstraktion über den Fäden. Es verwendet den Thread-Pool (es sei denn, Sie geben die Aufgabe als
LongRunning
Operation an. In diesem Fall wird unter der Haube ein neuer Thread für Sie erstellt).Thread-Pool
Wie der Name schon sagt: ein Pool von Threads. Verarbeitet das .NET Framework eine begrenzte Anzahl von Threads für Sie? Warum? Da das Öffnen von 100 Threads zur Ausführung teurer CPU-Operationen auf einem Prozessor mit nur 8 Kernen definitiv keine gute Idee ist. Das Framework verwaltet diesen Pool für Sie, verwendet die Threads wieder (nicht bei jedem Vorgang erstellen / beenden) und führt einige davon parallel aus, sodass Ihre CPU nicht brennt.
OK, aber wann soll jeder verwendet werden?
Im Lebenslauf: Verwenden Sie immer Aufgaben.
Aufgabe ist eine Abstraktion, daher ist sie viel einfacher zu verwenden. Ich rate Ihnen, immer zu versuchen, Aufgaben zu verwenden. Wenn Sie auf ein Problem stoßen, bei dem Sie einen Thread selbst bearbeiten müssen (wahrscheinlich 1% der Zeit), verwenden Sie Threads.
ABER sei dir bewusst, dass:
LongRunning
Aufgaben ( oder Threads, falls erforderlich ). Denn die Verwendung von Aufgaben würde Sie zu einem Thread-Pool führen, in dem einige Threads beschäftigt sind und viele andere Aufgaben darauf warten, dass der Pool an die Reihe kommt.quelle
Sie können
Task
angeben, was Sie tun möchten, und dies dannTask
mit einem anhängenThread
. DasTask
würde also in diesem neu erstelltenThread
und nicht im GUI-Thread ausgeführt.Verwenden Sie
Task
mit demTaskFactory.StartNew(Action action)
. Hier führen Sie einen Delegaten aus. Wenn Sie also keinen Thread verwenden, wird dieser im selben Thread (GUI-Thread) ausgeführt. Wenn Sie einen Thread erwähnen, können Sie diesenTask
in einem anderen Thread ausführen . Dies ist eine unnötige Arbeit, da Sie den Delegaten direkt ausführen oder diesen Delegaten an einen Thread anhängen und diesen Delegaten in diesem Thread ausführen können. Also benutze es nicht. es ist nur unnötig. Wenn Sie Ihre Software optimieren möchten, ist dies ein guter Kandidat, der entfernt werden sollte.** Bitte beachten Sie, dass das ein
Action
istdelegate
.quelle
Zusätzlich zu den oben genannten Punkten wäre es gut zu wissen, dass:
quelle
Normalerweise
Task
interagiere ich mit Winforms und einfachen Hintergrundarbeitern, damit die Benutzeroberfläche nicht einfriert. hier ein Beispiel, wenn ich es vorzieheTask
VS
Der Unterschied besteht darin, dass Sie keinen
MethodInvoker
kürzeren Code verwenden müssen.quelle
Die Aufgabe ist wie eine Operation, die Sie ausführen möchten. Thread hilft dabei, diese Operation über mehrere Prozessknoten zu verwalten. Task ist eine einfache Option, da Threading zu einer komplexen Codeverwaltung führen kann.
Ich werde vorschlagen, immer von MSDN (Best in World) Task zu lesen
Faden
quelle
Eine Aufgabe kann als bequeme und einfache Möglichkeit angesehen werden, etwas asynchron und parallel auszuführen.
Normalerweise ist eine Aufgabe alles, was Sie brauchen. Ich kann mich nicht erinnern, ob ich jemals einen Thread für etwas anderes als zum Experimentieren verwendet habe.
Sie können mit einem Thread (mit viel Aufwand) dasselbe erreichen wie mit einer Aufgabe.
Faden
Aufgabe
Eine Aufgabe verwendet standardmäßig den Threadpool, wodurch Ressourcen gespart werden, da das Erstellen von Threads teuer sein kann. Sie können eine Aufgabe als eine übergeordnete Abstraktion für Threads anzeigen.
Wie in diesem Artikel ausgeführt , bietet die Task über den Thread die folgenden leistungsstarken Funktionen.
Die Aufgaben sind auf die Nutzung von Multicores-Prozessoren abgestimmt.
Wenn das System mehrere Aufgaben hat, verwendet es den CLR-Thread-Pool intern und hat daher nicht den Overhead, der mit dem Erstellen eines dedizierten Threads mithilfe des Threads verbunden ist. Reduzieren Sie auch die Kontextwechselzeit zwischen mehreren Threads.
Warten Sie auf eine Reihe von Aufgaben ohne Signalisierungskonstrukt.
Wir können Aufgaben miteinander verketten, um sie nacheinander auszuführen.
Richten Sie eine Eltern-Kind-Beziehung ein, wenn eine Aufgabe von einer anderen Aufgabe aus gestartet wird.
Die Ausnahme für untergeordnete Aufgaben kann an übergeordnete Aufgaben weitergegeben werden.
Stornierung der Aufgabenunterstützung durch Verwendung von Stornierungs-Token.
Die asynchrone Implementierung ist mit den Schlüsselwörtern 'async' und 'await' einfach durchzuführen.
quelle