2012-09-13 6 views
22

In einer Windows 8-Anwendung in C#/XAML möchte ich manchmal eine erwartete Methode von einer nicht asynchronen Methode aufrufen.Ist es möglich, eine erwartete Methode in einer nicht asynchronen Methode aufzurufen?

Eigentlich ist es richtig, diese zu ersetzen:

public async Task<string> MyCallingMethod() 
    { 
     string result = await myMethodAsync(); 
     return result; 
    } 

durch diese:

public string MyCallingMethod() 
    { 
     Task.Run(async() => { 
      string result = await myMethodAsync(); 
      return result; 
      }); 
    } 

Der Vorteil für mich ist, dass ich MyCallingMethod ohne warten können, aber ist das richtig? Dies kann von Vorteil sein, wenn ich einen Ref-Parameter für MyCallingMethod übergeben möchte. Es ist nicht möglich, ref-Parameter in einer asynchronen Methode zu haben.

+0

wird nicht funktionieren. Ihre anonyme asynchrone Funktion gibt keinen Wert an äußere Funktion zurück. – Denis

Antwort

15

Sie sollten wirklich nicht versuchen, so etwas zu tun, wenn Sie auf dem UI-Thread sind, weil das bedeutet, dass Sie den Thread blockieren werden. Sie sollten stattdessen den Parameter ref umgehen, indem Sie beispielsweise einen Parameter eines einfachen Klassentyps akzeptieren, der den Wert enthält, den Sie ändern möchten.

Ein weiterer Grund, warum dies nicht zu tun ist, ist, dass Sie immer noch ref Parameter nicht verwenden können, da Lambdas ref Parameter der umschließenden Methode nicht zugreifen können.

Aber wenn Sie das wirklich wollen (wieder, ich denke wirklich, dass Sie nicht sollten), dann müssen Sie das Ergebnis der Task bekommen. Etwas wie:

public string MyCallingMethod() 
{ 
    var task = Task.Run(async() => 
    { 
     return await myMethodAsync(); 
    }); 
    return task.Result; 
} 
+0

Schöne, selbstauflösende Aufgabe und das Ergebnis zurückgeben. Vielen Dank – DRapp

40

In nicht-Asynchron-Methode können Sie entweder die Aufgabe starten asynchron und warten nicht auf das Ergebnis:

public void MyCallingMethod() 
{ 
    Task t = myMethodAsync(); 
} 

oder Sie können ContinueWith Event-Handler anhängen, die nach Beendigung genannt wird Aufgabe,

public void MyCallingMethod() 
{ 
    myMethodAsync().ContinueWith(
     result => 
     { 
      // do stuff with the result 
     }); 
} 

oder Sie das Ergebnis aus der Aufgabe synchron bekommen:

public string MyCallingMethod() 
{ 
    string result = myMethodAsync().Result; 
    return result; 
} 
Verwandte Themen