Das Schlüsselwort async
ist eigentlich kein Teil der geerbten Methodensignatur, sondern eher ein Signal an den Compiler, dass es die Methode gemäß dem Muster für asynchrone Methoden kompilieren und neu schreiben muss.
Daher können Sie das Schlüsselwort async
für geerbte Methoden weglassen, wenn die geerbte Methode das Schlüsselwort await
nicht verwendet.
Beachten Sie, dass Sie noch ein Task
oder Task<T>
zurückkehren müssen, dass ein Teil ist Teil der geerbten Methode Signatur. So
dies wird Ihnen eine Warnung:
class Base
{
public virtual async Task<int> Method()
{
await Task.Delay(10);
return 42;
}
}
class Derived : Base
{
// next line produces warning
public override async Task<int> Method()
{
return 42;
}
}
Die Warnung ist dies:
Warnung: CS1998 Dieses Asynchron-Methode fehlt 'erwarten' Operatoren und wird synchron laufen. Verwenden Sie den Operator await
, um nicht blockierende API-Aufrufe abzurufen, oder await Task.Run(...)
, um CPU-gebundene Arbeit an einem Hintergrund-Thread auszuführen.
Diese wird jedoch produziert keine Warnung:
class Derived : Base
{
public override Task<int> Method()
{
return Task.FromResult(42);
}
}
Bitte beachte, dass ich die return
Aussage in diesem letzten Verfahren geändert, weil ein Teil der „Magie“, dass das async
Schlüsselwort automatisch bringt zu wickeln ist der Rückgabewert in einem Task<T>
. Wenn Sie andere Weisen haben eine Task<T>
zu erhalten, natürlich müssen Sie nicht um das Ergebnis zu wickeln, wie ich oben tat.
Ich verstehe die Frage nicht. Async ist nicht Teil der Methodensignatur, die geerbt wird. Schreiben Sie 'async' einfach nicht, wenn Sie eine überschriebene Methode deklarieren, die nicht' wartet' verwendet. Sie werden nach wie vor, obwohl eine 'Task' oder' Aufgabe 'zurückkehren müssen. Sie sollten sowohl Code, der das Problem aufweist, als auch die eigentliche Warnung veröffentlichen, damit es keine Verwirrung darüber gibt, welches eigentliche Problem Sie haben. –
Können Sie das async-Schlüsselwort nicht weglassen, wenn die Methode das Schlüsselwort await nicht verwendet? – Stefan
einige Beispiele von dem, was Sie gefunden haben, sollte es eine bessere Frage machen. –