Ich habe gerade 3 Routinen bezüglich der TPL-Verwendung gesehen, die den gleichen Job machen. Hier ist der Code:
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Better: Create and start the task in one operation.
Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
Ich verstehe einfach nicht , warum MS 3 verschiedene Möglichkeiten gibt Arbeitsplätze in TPL laufen , weil sie alle Arbeiten gleich: Task.Start()
, Task.Run()
und Task.Factory.StartNew()
.
Sag mir, sind Task.Start()
, Task.Run()
und Task.Factory.StartNew()
alle für den gleichen Zweck verwendet oder haben sie andere Bedeutung?
Wann sollte man verwenden Task.Start()
, wann sollte man verwenden Task.Run()
und wann sollte man verwenden Task.Factory.StartNew()
?
Bitte helfen Sie mir, ihre tatsächliche Verwendung gemäß dem Szenario anhand von Beispielen detailliert zu verstehen, danke.
Task.Run
- vielleicht wird dies Ihre Frage beantworten;)Task.Start
tatsächlich nützlich ist.Antworten:
Task.Run
ist eine Abkürzung fürTask.Factory.StartNew
mit bestimmten sicheren Argumenten:Es wurde in .Net 4.5 hinzugefügt, um die immer häufiger werdende Nutzung
async
und Verlagerung von Arbeiten an die .Net 4.5 zu erleichternThreadPool
.Task.Factory.StartNew
(hinzugefügt mit TPL in .Net 4.0) ist viel robuster. Sie sollten es nur verwenden, wennTask.Run
es nicht ausreicht, z. B. wenn Sie es verwenden möchtenTaskCreationOptions.LongRunning
(obwohl es nicht erforderlich ist, wenn der Delegat asynchron ist . Mehr dazu in meinem Blog: LongRunning ist für Aufgaben nutzlos. Mit asynchronem Warten ausführen ). Mehr dazuTask.Factory.StartNew
in Task.Run vs Task.Factory.StartNewErstellen Sie niemals ein
Task
und rufenStart()
Sie an, es sei denn, Sie finden einen sehr guten Grund dafür. Es sollte nur verwendet werden, wenn Sie einen Teil haben, der Aufgaben erstellen, aber nicht planen muss, und einen anderen Teil, der ohne Erstellen geplant wird. Das ist fast nie eine angemessene Lösung und könnte gefährlich sein. Mehr in "Task.Factory.StartNew" vs "Neue Aufgabe (...). Start"Abschließend, meistens verwenden
Task.Run
, verwenden,Task.Factory.StartNew
wenn Sie müssen und nie verwendenStart
.quelle
Task.Start
hat seinen Platz für das Erben von Typen meistens.Kurze Antwort :
Wenn Sie keine verschachtelten untergeordneten Aufgaben verwenden und immer möchten, dass Ihre Aufgaben im Thread-Pool ausgeführt werden , ist es besser, sie zu verwenden
Task.Run
.Lange Antwort:
Task.Run
undTask.Factory.StartNew
beide bieten Unterstützung für das Erstellen und Planen von Aufgabenobjekten, sodass wir kein aTask
und keinen Aufruf erstellen müssenStart()
Ist äquivalent zu:
Und
Ist äquivalent zu:
Task.Run
verwendet,TaskCreationOptions.DenyChildAttach
was bedeutet, dass untergeordnete Aufgaben nicht an das übergeordnete Element angehängt werden können, und verwendet,TaskScheduler.Default
was bedeutet, dass diejenige, die Aufgaben im Thread-Pool ausführt, immer zum Ausführen von Aufgaben verwendet wird.Task.Factory.StartNew
verwendet,TaskScheduler.Current
was bedeutet, Scheduler des aktuellen Threads, es kann sein,TaskScheduler.Default
aber nicht immer.quelle