Was sollte ich als Dummy erwarten?

8

Ich habe eine Basisklasse, die eine Methode mit der folgenden Signatur zur Verfügung stellt:

%Vor%

Abgeleitete Klassen sollten diese Implementierung mit etwas wie

überschreiben %Vor%

Nun gibt mir der Compiler eine Warnung, dass der Base.RunAsync eine Warteanweisung fehlt. Ich möchte, dass mein Code Warnung frei ist, keine Warnungen unterdrückt und dass er ausgeführt wird, ohne Null-Checks zu liefern, auch wenn die abgeleitete Klasse keine Override-Implementierung bietet. Daher ist es nicht möglich mit virtual Task RunAsync() (das async-Schlüsselwort wegzulassen) .

Momentan ist die Implementierung in der Basismethode await Task.Delay(0); , was die Compilerwarnung ablehnt, ist aber meiner Meinung nach nicht "sauber". Was ist der richtige Weg, um mit diesem Thema fertig zu werden?

    
David 04.03.2015, 09:40
quelle

1 Antwort

10

Sie verstehen falsch, wie async funktioniert. Es ist nicht Teil der Signatur, also wenn Sie <%> das await nicht benötigen, müssen Sie es nicht wirklich verwenden. Auch wenn Sie eine Methode Task RunAsync() bereitstellen, können Sie sie einfach ohne async schreiben, zum Beispiel:

%Vor%

Dies erlaubt Ihnen immer noch eine Überschreibung, die tatsächlich await verwendet, wie folgt:

%Vor%

Dies ist der Grund, warum der Compiler Sie warnt - das async Schlüsselwort ist völlig nutzlos und nicht Teil der Methodensignatur. Es ist nur ein Signal für den Compiler, dass es erlaubt ist, den Bezeichner await als Schlüsselwort zu verwenden, um die Rückwärtskompatibilität mit älterem C # -Code aufrechtzuerhalten.

BEARBEITEN :

Wie Jeroen Mostert in den Kommentaren von .NET Framework 4.6 an bemerkt hat, ist die Eigenschaft Task.CompletedTask public, also können Sie Folgendes tun:

%Vor%

Wenn Sie also 4.6+ verwenden können, ist dies die neueste, sauberste Option. Und natürlich, wenn Sie die Aufgabe benötigen, um tatsächlich einen Wert zurückzugeben, ist Task.FromResult immer noch da:)

    
Luaan 04.03.2015, 09:46
quelle

Tags und Links