2013-08-05 15 views
15

Ich habe ein wenig gelesen, und denke, ich habe die Grundlagen der abwarten und async Keywords, in Bezug auf System.Threading.Task.Warten auf Aufgaben: Zurück Aufgabe oder warten, wenn kein Code nach dem warten

Ich bin nicht sicher, ob ich über ein kleines Problem richtig bin, und suche nach Verifizierung oder für jemanden, der mich korrigiert.

ich ein asynchrones Verfahren bin Umsetzung mit dieser Signatur:

public Task ProcessUploadedFile(FileInfo info, string contentType); 

Natürlich, wenn ich etwas innerhalb der Methode abwarten will, muss ich das Asynchron-Schlüsselwort in die Signatur hinzuzufügen,

Meine Frage ist dies: Wenn die letzte Sache, die meine Methode tut, eine andere Async-Methode aufruft oder eine Aufgabe zurückgibt, gibt es keinen Grund, darauf zu warten?

Eg.

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType) 
{ 
    foreach (var something in someCollection) 
    DoSomething(); 

    DoSomethingElse(); 

    await DoMethodAsync(); 
} 

2:

public Task ProcessUploadedFile(FileInfo info, string contentType) 
    { 
     foreach (var something in someCollection) 
     DoSomething(); 

     DoSomethingElse(); 

     return DoMethodAsync(); 
    } 

Ich schrieb zunächst die ehemalige, aber nicht mehr den Punkt in Hinzufügen der await sehen können. Wenn ich Letzteres schreiben würde, würde ich das Gleiche tun, und der Aufrufer beider Methoden kann immer noch das Schlüsselwort abwarten, wenn sie sich entscheiden, nein?

Gibt es einen Unterschied in den oben genannten? Welches ist besser"?

Antwort

16

await wird verwendet, um die Ausführung des Methodenrumpfs fortzusetzen, wenn der Vorgang abgeschlossen ist. Wenn nichts weiter geht, brauchen Sie nicht zu warten.

Sie können sich vorstellen abwarten (vereinfacht) wie von ContinueWith Betrieb. Also, Ihre erste Methode ist so etwas wie:

foreach (var something in someCollection) 
    DoSomething(); 

DoSomethingElse(); 

DoMethodAsync().ContinueWith(t => {}); 

Es schöne MSDN-Artikel ist die what happens in async method beschreibt, welche schöne Code Flussbild hat:

enter image description here

+1

Große, das ist, was ich dachte. Vielen Dank! –

+1

Warten. Kann ich nur etwas klären? In Ihrer neu geschriebenen Version meines Codes haben Sie die DoSomething() und DoSomethingElse() in einer Task.Factory.StartNew() ... ist das richtig? Ich dachte, diese Bits würden synchron laufen, im selben Thread wie der Anrufer? Und es wäre DoMethodAsync(). ContinueWith (t => {} _); ? –

+1

@dark_perfect Sorry, war in Eile. Und ja, du hast vollkommen recht. Aktualisierter Code –