Aktionsmethodenaufruf in asynchronen Aktionsmethodenaufruf konvertieren

8

Ich habe diese Methode

%Vor%

und ich muss es in einen asynchronen Methodenaufruf wie diesen konvertieren

%Vor%

Das Problem mit dem obigen Code ist, dass der Compiler den folgenden Fehler ausgibt

  

Der 'abwarten' Operator kann nur innerhalb eines asynchronen Lambdas verwendet werden   Ausdruck. Erwägen Sie, diesen Lambda-Ausdruck mit dem 'async' zu markieren   Modifikator.

    
vcRobe 26.11.2015, 14:54
quelle

3 Antworten

13

Wenn Sie await für einen Delegaten verwenden möchten, muss der Typ Func<Task> oder Func<Task<T>> lauten. Ein Action ist äquivalent zu einer void Action() benannten Methode. Sie können nicht auf void warten, aber Sie können Task Func() oder Task<T> Func abwarten:

%Vor%

Wenn dies nicht möglich ist, bedeutet dies, dass die Methode intern nicht wirklich asynchron ist, und was Sie eigentlich tun möchten, ist die Ausführung des synchronen Delegaten in einem Thread-Pool-Thread, was eine andere Sache ist, und isn führe nicht wirklich etwas asynchron aus. In diesem Fall reicht das Umbrechen des Aufrufs mit Task.Run aus.

    
Yuval Itzchakov 26.11.2015 14:58
quelle
3

Versuchen Sie Folgendes:

%Vor%

Durch die Verwendung von Task.Run() wird ein Ergebnis erstellt, indem Sie Ihre Aktion für eine andere Aufgabe ausführen. Beachten Sie außerdem, dass das Behandeln von Ausnahmen auf "erwartete" nicht als beabsichtigt funktioniert.

Bessere Umgehung des action() -Aufrufs in einem try-Vorgang und Aufrufen von do Task.Run() auf diesem Wrapper.

    
Tamas Ionut 26.11.2015 14:58
quelle
0

Lassen Sie uns Ihren Ausgangspunkt zu:

vereinfachen %Vor%

Weil du sagst, dass finally nicht wichtig ist.

Gültig, aber sinnlos:

%Vor%

Das wird ziemlich genau so sein wie:

%Vor%

Das heißt, dass es tut, was das Nicht-Async tut, und dann eine "abgeschlossene" Aufgabe zurückgibt, so dass nichts gewonnen wird. Es ist jedoch erwähnenswert, da es oft ein gültiger Teilweg ist, wenn man von nicht asynchron nach asynchron wechselt.

Besser:

%Vor%

Was in diesem Fall, weil es sich um einen einzigen Void-Return-Aufruf handelt, kann vereinfacht werden zu:

%Vor%

Ob es sich lohnt oder nicht, ist eine andere Sache. Dadurch wird der aktuelle Thread nicht verwendet, aber er wird an einen anderen Thread übergeben, um die Arbeit zu erledigen. Wenn wir nur auf das Ergebnis warten, wenn es aufgerufen wird, können wir genauso gut die nicht asynchrone Version aufrufen und damit fertig sein. Wenn wir jedoch WaitAll im Aufrufer machen oder etwas anderes, das davon profitiert, dann könnte es in der Tat nützlich sein.

Vielleicht viel besser ist aber:

%Vor%

Hier gibt es eine Async-Version der Methode, die wir aufrufen, also ändern wir uns, um davon Gebrauch zu machen. Nun, das könnte genauso sein wie oben, wenn actionAsync nur einen Thread hochspinnt oder den Thread-Pool verwendet. Wenn jedoch actionAsync etwas mit asynchronem I / O macht, dann ist das ein viel größerer Vorteil.

Beachten Sie, dass wir in diesem Fall die Aufgabe, die wir erhalten, einfach als "tail" bezeichnet haben:

%Vor%

Das wäre jedoch nicht dasselbe, wenn wir etwas nach einem await innerhalb unserer Methode getan hätten. Zum Beispiel:

%Vor%

Müsste werden:

%Vor%

Oder wenn otherAction keine asynchrone Version hatte:

%Vor%     
Jon Hanna 26.11.2015 15:28
quelle

Tags und Links