Ich habe gerade drei Routinen bezüglich der TPL-Nutzung 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 nur nicht, warum MS 3 verschiedene Möglichkeiten gibt, Jobs in TPL auszuführen, da sie alle gleich funktionieren: Task.Start()
, Task.Run()
und Task.Factory.StartNew()
.
Sagen Sie mir, werden Task.Start()
, Task.Run()
und Task.Factory.StartNew()
alle für den gleichen Zweck verwendet oder haben sie unterschiedliche Bedeutung?
Wann sollte man Task.Start()
verwenden, wann sollte man Task.Run()
verwenden und wann sollte man Task.Factory.StartNew()
verwenden?
Bitte helfen Sie mir, ihre tatsächliche Verwendung gemäß Szenario anhand von Beispielen detailliert zu verstehen.
Task.Run
Ist eine Abkürzung für Task.Factory.StartNew
Mit bestimmten sicheren Argumenten:
Task.Factory.StartNew(
action,
CancellationToken.None,
TaskCreationOptions.DenyChildAttach,
TaskScheduler.Default);
Es wurde in .Net 4.5 hinzugefügt, um die immer häufigere Verwendung von async
und das Auslagern von Arbeit in ThreadPool
zu erleichtern.
Task.Factory.StartNew
(Hinzugefügt mit TPL in .Net 4.0) ist wesentlich robuster. Sie sollten es nur verwenden, wenn Task.Run
Nicht ausreicht, zum Beispiel, wenn Sie TaskCreationOptions.LongRunning
Verwenden möchten (obwohl es nicht erforderlich ist, wenn der Delegat asynchron ist. Mehr dazu in meinem Blog: LongRunning ist nutzlos für Task.Run With async-await ). Mehr zu Task.Factory.StartNew
In Task.Run vs Task.Factory.StartNew
Erstellen Sie niemals ein Task
und rufen Sie Start()
auf, es sei denn, Sie finden einen sehr guten Grund dafür. Es sollte nur verwendet werden, wenn Sie einen Teil haben, der Aufgaben erstellen muss, diese aber nicht terminiert, und einen anderen Teil, der terminiert, ohne Aufgaben zu erstellen. Das ist fast nie eine angemessene Lösung und könnte gefährlich sein. Weitere Informationen finden Sie unter "Task.Factory.StartNew" vs "Neue Task (...). Start"
Verwenden Sie abschließend meistens Task.Run
Und Task.Factory.StartNew
, Wenn Sie Start
verwenden müssen und niemals.