2017-07-18 3 views
-1

Warum sehe ich einen Unterschied im Verhalten bei der Verwendung von Task.Run vs Task.Start?Task.Run vs Task.Start

Code-Snippet:

async Task<string> RunAsync() 
{ 
    await Task.Delay(2); 
    Console.WriteLine("In RunAsync"); 
    return "{}"; 
} 

void Approach1() 
{ 
    var task = new Task(async() => await RunAsync()); 

    task.Start(); 
    task.Wait(); 

    Console.WriteLine("In Approach1"); 
} 

void Approach2() 
{ 
    var task = Task.Run(() => RunAsync()); 

    task.Wait(); 

    Console.WriteLine("In Approach2"); 
} 


void Main() 
{ 
    Approach1(); 
    Approach2(); 
} 

tatsächliche Ausgang:

In Approach1 
In RunAsync 
In RunAsync 
In Approach2 

ich die folgende Ausgabe zu erwarten:

In RunAsync 
In Approach1 
In RunAsync 
In Approach2 

Bitte beachte, dass ich auf dem Blog gekommen sind, die Aufgabe schlägt vor, gegen die Verwendung von .Start: https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/

+1

Es gibt mehr Unterschiede in den beiden Beispielen, die Sie angeben, als nur, ob Sie 'Task.Run()' oder 'Task.Start()' aufrufen. Sehen Sie sich die markierten Duplikate an, warum dieser Unterschied wichtig ist. Kurze Version: In Ihrem ersten Beispiel haben Sie keinen Mechanismus zur Verfügung gestellt, um auf die 'RunAsync()' -Arbeit zu warten, also gelangen Sie zuerst zum _ "In Approach1" _-Ausgang, bevor 'RunAsync()' ausgeführt wird . –

Antwort

0

In Approach1 verwenden Sie erwarten. Warten wartet nicht auf irgendetwas. Sie haben also eine asynchrone Aufgabe in Ihrer Aufgabe, die asynchron ausgeführt wird. Dann wird die RunAsync-Methode ausgelöst und vergißt, wodurch die Aufgabe beendet wird, während die Async-Methode noch ausgeführt wird.

+1

Mit Ansatz2 meinst du Ansatz1? – pmohandas

+0

danke, bearbeitet zu beheben –

Verwandte Themen