2016-06-30 16 views
0

Ich denke, ich könnte Methode ausführen, die asynchrone Task-Methode asynchron verwendet, nachdem ich es anrufe, aber es blockiert, tatsächlich läuft es synchron, siehe meinen Code wie unten.Wie Sie eine Methode ausführen, die das asynchrone Task-Schlüsselwort asynchron verwendet?

static void Main(string[] args) 
    { 
     asyncTest();// use asyncTest.Wait() help nothing. 
     Console.ReadKey(); 
    } 

    static async Task asyncTest() 
    { 
     Console.WriteLine("before init task second " + DateTime.Now.Second); 
     var t1 = getInt1S();// I supposed it to run background,but it blocked 
     var t3 = getInt3S(); 
     //var await1 = await t1;//this line just no use, run quickly 
     //var await3 = await t3;//this line just no use, run quickly 
     Console.WriteLine("after init task second " + DateTime.Now.Second); 
    } 

    static async Task<int> getInt1S() 
    { 
     Console.WriteLine("getInt1S" + DateTime.Now.Second); 
     Task.Delay(1000).Wait(); 
     return 1; 
    } 

    static async Task<int> getInt3S() 
    { 
     Console.WriteLine("getInt3S" + DateTime.Now.Second); 
     Thread.Sleep(3000); 
     return 3; 
    } 

Ausgabe wie:

before init task second 21 
getInt1S 21 
getInt3S 22 
after init task second 25 

warum 'getInt1S()' und 'erwarten getInt3S()' alle synchron laufen? Gibt es eine Möglichkeit, Code wie:

var a = methodSync();//method define like: async Task<T> methodSync() 
Console.Write("");//do something during processing the methodSync 
T b = await a; 

Ich werde nicht herausfinden, wie verwenden ‚async methodSync()‘ in ConsoleApp.Just, wie mein ‚t1‘ zu machen und ‚t2‘ laufen asynchron 'asyncTest()'.

Ich arbeite an async/await, so möchte ich etwas finden, unterscheiden sich von 'var a = new Aufgabe (() => {return 1;})'

den Weg der Anruf asyncTest Do() Angelegenheit? oder was ich verpasst habe?

Wer könnte mir helfen? oder auf meinen Fehler hinweisen.

Danke.

+1

Der Compiler wird Ihnen Warnungen geben, die Ihnen sagen, dass Ihre 'async' Methoden synchron laufen, weil Sie' awaward' nicht verwenden. Ich habe ein ['async'-Tutorial] (http://blog.stephencleary.com/2012/02/async-and-await.html), das Sie hilfreich finden können. –

+0

Mögliches Duplikat von [Der Modifizierer 'async' für die 'Main'-Methode einer Konsolen-App kann nicht angegeben werden] (http://stackoverflow.com/questions/9208921/cant-specify-the-async-modifier-on-- die-main-methode-einer-konsole-app) – Eris

Antwort

2

Alle asynchronen Methoden laufen synchron bis zur ersten await Anweisung.

Wenn dann das erwartete (was auf await wartet) abgeschlossen ist, wird es synchron weiter ausgeführt bis zum nächsten await Befehl oder das Ende der Methode.

Sobald ein not completed savourable erreicht ist, wird das Steuerelement an die aufrufende Methode zurückgegeben, die Task zurückgibt, die abgeschlossen wird, wenn alle erwartet in der asynchronen Methode abgeschlossen sind und das Ende der Methode erreicht ist.

Die Absicht dieser Compiler-Funktion ist es, einfach Code zu produzieren, der sequentiell läuft (nicht synchron), also, was Sie sehen.

+0

Ich finde es heraus. Ersetze die Task.Delay (1000) .Wait() und Thread.Sleep (3000) mit warten Task.Delay (1000) wird getInt1S laufen() und getInt1S() asynchron. Ich habe, dass jedes Mal, wenn eine Aufgabe erstellt wird, System den gesamten Code synchron in der Aufgabe ausgeführt wird, es sei denn, es wird von abwarten. Task Creater wird den gesamten Code in Schließung synchron ausgeführt wird, ist neu für mich. –

+1

'erwarten' erstellt keine' Aufgabe'. –