2016-05-22 7 views
0

Was ich nicht verstehe, ist das folgende Snippet from MSDN:Aus der Sicht des Aufrufers unterscheidet sich das Aufrufen einer asynchronen Methode vom Aufruf einer synchronen Methode.

Beachten Sie, dass das Verfahren nun mit dem neuen Asynchron-Schlüsselwort gekennzeichnet ist; Dies ist einfach ein Indikator für den Compiler, der es wissen lässt, dass im Kontext dieser Methode das Schlüsselwort erwartet als Punkt behandelt werden soll, wo der Workflow die Kontrolle an den Aufrufer zurückgibt und wieder wenn die zugehörige Aufgabe ist fertig.

Wie ist das anders als wie funktioniert nicht-async Methoden?

Wenn ich

int x; 
x = SomeNormalFunctionThatReturnsAnInt(); 
Console.WriteLine(x); 

oder

int x; 
Task<int> task = SomeAsyncFunctionThatReturnsAnInt(); 
x = await task; 
Console.WriteLine(x); 

dann aus der Sicht des Anrufers, die Reihenfolge der Ausführung ist genau das gleiche: ein int namens x definiert ist, Eine Funktion, die eine int zurückgibt, wird ausgeführt, und wenn diese Funktion ausgeführt wird, wird der Rückgabewert auffestgelegt, die dann in die Konsole geschrieben wird.

Antwort

2

aus der Sicht des Anrufers haben, ist die Reihenfolge der Ausführung der genau gleich

Ja und nein.

Wenn Sie await alle Aufgaben, sobald sie an Sie zurückgegeben werden, dann ja, diese Methode isoliert sieht die gleiche "Reihenfolge der Ausführung". Dies ist eigentlich der gesamte Punktasync/await - es ermöglicht Schreiben der meisten asynchronen Code in einer Weise, die sehr natürlich und ähnlich äquivalenten synchronen Codes ist.

Allerdings muss der Anrufer beachten, dass es asynchron sein muss.Das heißt, der Anrufer verwendet normalerweise await, was bedeutet, dass es async sein muss. Es gibt einige hinzugefügte Twists, die mit asynchronem Code kommen. Ein Beispiel: Wenn dies auf einem UI-Thread ausgeführt wird, weiß der synchrone Code, dass nichts anderes auf dem UI-Thread zwischen SomeNormalFunctionThatReturnsAnInt und ausgeführt werden kann. asynchroner Code verwendet jedoch await, sodass er akzeptieren muss, dass auf dem UI-Thread zwischen SomeAsyncFunctionThatReturnsAnInt und Console.WriteLine noch etwas ausgeführt werden kann. Wenn man es aus diesem Kontext betrachtet, ist es nicht genau dasselbe; Bei asynchronen Methoden kann die Ausführungsreihenfolge angehalten werden, während anderer Code ausgeführt wird.

0

Wenn Sie nicht gewartet haben, könnte das Ergebnis der Funktion x nicht initialisiert werden. Aber hier wartest du darauf, also gibt es keinen Unterschied.

0

Sie einige Lese auf der Asynchron und Synchron haben müssen, um zu sehen, was in Leistungsniveau geschieht,

in Ihrem Beispiel ist das Ergebnis nicht anders, wie Sie die Methode in Zeile await warten sagen läßt aber hat ein Blick auf dem folgenden Code-Schnipsel

class Program { 
    private static string result; 

    static void Main() { 
    SaySomething(); 
    Console.WriteLine(result); 
    } 

    static async Task<string> SaySomething() { 
    await Task.Delay(5); 
    result = "Hello world!"; 
    return “Something”; 
    } 
} 

können Sie versuchen, den Ausgang zu berechnen, ist das Ergebnis nichts, warum?

mit dem await wir die Hauptaufgabe lassen fortsetzen, wie wir 5 Millisekunden warten, bevor Ergebnis Rückkehr, einen Blick auf

https://msdn.microsoft.com/en-gb/library/mt674882.aspx

+0

Task.Delay dauert Millisekunden nicht Sekunden, wenn Sie 5 Sekunden warten wollten, wäre das Task.Delay (5000) –

Verwandte Themen