none
await Aufruf aus einer nicht-Async Methode? RRS feed

  • 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

    Mittwoch, 12. Oktober 2016 08:02

Antworten

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üße

    Sascha


    Dann entspricht die Convert Methode der Signatur der Schnittstelle hast aber eine Methode mit dem Async.
    Mittwoch, 12. Oktober 2016 08:12
  • 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


    Mittwoch, 12. Oktober 2016 08:48
    Beantworter
  • Danke, aber das klappt so nicht mit Rückgabewerten.

    Gruß Achim

    Mittwoch, 12. Oktober 2016 09:02
  • 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

    Mittwoch, 12. Oktober 2016 09:14
  • 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
    Mittwoch, 12. Oktober 2016 09:18
  • Hallo Achim,

    in dem Fall solltest Du Dir mal anschauen (auch Stephen Cleary): Async Implementation of IValueConverter.

    Gruß Elmar

    Mittwoch, 12. Oktober 2016 09:55
    Beantworter