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.
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:
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.
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.
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:
Müsste werden:
%Vor% Oder wenn otherAction
keine asynchrone Version hatte:
Tags und Links c# asynchronous