2015-07-31 12 views
5

Mam wirtualną metodę, która czasami zawiera oczekiwanie na połączenia, a czasami nie. IDE daje mi ostrzeżenie, jaki jest właściwy sposób postępowania z tym?Asynchronizacja/oczekiwanie bez oczekiwania na połączenie

W mojej klasie bazowej:

protected virtual async Task GoNext() 

z klasy bazowej to sprawdzony poprzez czekają.

Następnie w moich podklasach nadpisuję tę metodę, ale zdarzają się sytuacje, w których zawiera ona oczekiwanie i czasy, w których się nie znajduje.

+5

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

+0

Nie możesz ominąć słowa asynchronicznego, jeśli metoda nie używa słowa kluczowego oczekują? – Stefan

+1

kilka przykładów tego, co znalazłeś, powinno sprawić, że będzie to lepsze pytanie. –

Odpowiedz

8

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.

Powiązane problemy