Słowo kluczowe nie jest częścią składową dziedziczonego sygnatury metody, ale jest bardziej sygnałem dla kompilatora, który musi skompilować i przepisać metodę zgodnie ze wzorcem dla metod asynchronicznych.
W związku z tym można pominąć słowo kluczowe async
dla metod dziedziczonych, jeśli metoda odziedziczona nie używa słowa kluczowego await
.
pamiętać, że trzeba jeszcze zwróci Task
lub Task<T>
, że część jest część odziedziczonego podpisu metody.
Więc to daje ostrzeżenie:
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;
}
}
Ostrzeżenie to:
Ostrzeżenie: CS1998 Ten sposób asynchroniczny brakuje „czekają” operatorów i będzie działać synchronicznie. Rozważ użycie operatora await
, aby poczekać na nie blokujące wywołania interfejsu API lub await Task.Run(...)
, aby wykonać pracę związaną z procesorem w wątku w tle.
To jednak nie będzie produkować ostrzeżenie:
class Derived : Base
{
public override Task<int> Method()
{
return Task.FromResult(42);
}
}
pamiętać, że zmieniły się oświadczenie return
w tej ostatniej metody, ponieważ część „magii”, że słowo kluczowe async
sprowadza się do automatycznego zawijania wartość zwracana wewnątrz Task<T>
. Jeśli masz inne sposoby na uzyskanie Task<T>
, oczywiście nie musisz owijać wyniku tak jak powyżej.
Nie rozumiem pytania. 'async' nie jest częścią podpisu metody, który jest dziedziczony. Po prostu nie pisz "async" podczas deklarowania przesłoniętej metody, która nie używa 'await'. Nadal będziesz musiał jednak zwrócić 'Task' lub' Task '. Powinieneś opublikować kod, który pokazuje problem, jak również faktyczne ostrzeżenie, aby nie było żadnych wątpliwości co do tego, jaki masz prawdziwy problem. –
Nie możesz ominąć słowa asynchronicznego, jeśli metoda nie używa słowa kluczowego oczekują? – Stefan
kilka przykładów tego, co znalazłeś, powinno sprawić, że będzie to lepsze pytanie. –