Benutzer mit den meisten Antworten
await Aufruf aus einer nicht-Async Methode?

Frage
-
Hallo Group,
wie kann ich eine Async-Methode aus einer nicht-Async Methode aufrufen?
Ich würde die Methode ja gerne in eine Async-Methode ändern, aber das geht nicht, da sie dann nicht mehr der Schnittstelle entspricht.
Der folgende Code funktioniert so natürlich nicht, weil await nur in eine Async-Methode benutzt werden darf.
public string Convert(object value) { return await ConvertAsync(value); }
Gruß Achim
Antworten
-
Hallo Achim,
in dem Fall solltest Du Dir mal anschauen (auch Stephen Cleary): Async Implementation of IValueConverter.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 17. Oktober 2016 12:24
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 28. Oktober 2016 08:48
Alle Antworten
-
Hallo Achim
Du kannst ja eine Methode dazwischen Aufrufen.
Hier in VB.NET:
Public Sub Convert(value As Object) DoConvertAsync(value) End Sub Private Async Sub DoConvertAsync(value As Object) Await ConvertAsync(value) End Sub
GrüßeSascha
Dann entspricht die Convert Methode der Signatur der Schnittstelle hast aber eine Methode mit dem Async. -
Hallo Achim,
Du kannst anstatt dessen Task.Result abfragen, das wartet implizit auf das Ergebnis:
public string Convert(object value) { return ConvertAsync(value).Result; }
Allerdings gibt es einige (u. u. signifikante) Unterschiede, siehe dazu Stephen Cleary in Await on a completed task same as task.Result?. Wie dort ausgeführt, solltest Dir gut überlegen, ob Du aus reiner Schönheit darauf verzichten willst. Denn wirklich gewinnen tust Du damit nichts, ausgenommen potentiellen Ärger.
Gruß Elmar
-
Hallo Elmar,
Danke für den Tipp.
Ich möchte nicht 'aus reiner Schönheit' darauf verzichten. Aber ich benutze das Interface IValueConverter von Xamarin.Forms und dort ist die Convert-Methode eben nicht Async.
Anderseits möchte ich meine Async-Methode nicht auf synchron umstellen, da es darin zu Dateizugriffen kommt.
Von daher bleibt mir wohl nichts anderes übrig, als es mit .Result zu realisieren.
Gruß Achim
-
Hallo Achim
Ich wollte nur ein Beispiel zeigen. Wäre ja ganz einfach so umzubauen das es auch mit Rückgabewerten funzt.
Public Function Convert(value As Object) As String Return DoConvertAsync(value).Result End Function Private Async Function DoConvertAsync(value As Object) As Task(Of String) Return Await ConvertAsync(value) End Function
Grüße
Sascha -
Hallo Achim,
in dem Fall solltest Du Dir mal anschauen (auch Stephen Cleary): Async Implementation of IValueConverter.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 17. Oktober 2016 12:24
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 28. Oktober 2016 08:48