webentwicklung-frage-antwort-db.com.de

Verwendung von Task.Start (), Task.Run () und Task.Factory.StartNew ()

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.

123
Mou

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.

148
i3arnon