2017-12-05 4 views
4

Ich brauche den zurückgegebenen Wert ohne warten Operator (in Beispiel unten muss ich die "hello world" in var y ohne warten Operator). Weil eine Methode auf viele Orte bezogen ist. Aber meine Anforderung ist, dass die Methode für bestimmte Operationen asynchron ausgeführt wird. Keines anderen Mal genügt es, synchron ausgeführt zu werden.Wie bekomme ich den Wert ohne warten Opera

Wenn ich in allen genannten Orten warten, muss diese Methode als async geändert werden und auch Methoden müssen als async ändern und warten. Gibt es eine Möglichkeit, den zurückgegebenen Wert zu erhalten?

finden Sie unter Beispielcode-Schnipsel:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var x = getString(); 
    } 

    public static async Task<string> getString() 
    { 
     var y = await GetString2(); 
     return y; 
    } 

    public static async Task<string> GetString2() 
    { 
     return "hello world"; 
    } 

} 

Hier gibt es eine Möglichkeit, "Hallo Welt" ohne Bediene erwarten in var y String zu bekommen?

+0

, warum Sie mit 'async' hier? – gypsyCoder

Antwort

4

Sind Sie auf der Suche nach so etwas?

var str = GetString2().Result; 

Result blockiert den aufrufenden Thread, bis die asynchrone Operation abgeschlossen ist; es entspricht der Wait Methode. await hat asynchron auf den Abschluss der Aufgabe warten.

Auch, wie @Sir Rufo und @MistyK beschrieben, erhalten Sie AggregateException auf eine mögliche Ausnahme, so wäre es besser, GetAwaiter wie folgt zu verwenden;

var str = GetString2().GetAwaiter().GetResult(); 
+2

Sie sollten das Ergebnis für eine nicht erwartete Aufgabe mit task.GetAwaiter() bekommen. GetResult() –

2

Sie haben eine von zwei Optionen:

  1. Entweder die Result Eigenschaft der Aufgabe verwenden. Dies hat den Nachteil, dass es die Nachrichtenpumpe blockieren und problems verursachen kann. In einer Konsolen-App könnte das funktionieren, aber Sie müssen testen.

    GetString2().Result;

  2. Verwenden Sie die Methode ContinueWith zum Übergeben einer Aktion, die ausgeführt werden soll, wenn die Aufgabe abgeschlossen ist. Der Nachteil ist, dass Sie nicht sofort auf die Daten zugreifen können und die aufrufende Funktion zurückkehrt.

    GetString2().ContinueWith(result => Console.WriteLine(result));

4

Ich würde nicht verwenden, weil Wenn der Fehler ausgelöst wird, werden Sie Aggregate erhalten. Es ist besser, dies zu tun:

var str = GetString2().GetAwaiter().GetResult()

Verwandte Themen