2015-07-31 6 views
5

nennen Ich habe eine virtuelle Methode, die manchmal erwarten Anrufe enthalten und manchmal nicht. Die IDE gibt mir eine Warnung, was ist der richtige Weg, um damit umzugehen?Async/Await ohne await

In meiner Basisklasse:

protected virtual async Task GoNext() 

Von der Basisklasse es über await aufgerufen.

Da ist in meinem Unterklassen ich diese Methode überschreiben, aber es gibt Zeiten, dass es eine await und Zeiten enthält, die es nicht tut.

+5

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. –

+0

Können Sie das async-Schlüsselwort nicht weglassen, wenn die Methode das Schlüsselwort await nicht verwendet? – Stefan

+1

einige Beispiele von dem, was Sie gefunden haben, sollte es eine bessere Frage machen. –

Antwort

8

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.

Verwandte Themen