Tengo un método virtual que a veces contiene llamadas en espera y otras veces no. El IDE me da una advertencia, ¿cuál es la forma correcta de manejar esto?
En mi clase base:
protected virtual async Task GoNext ()Desde la clase base se llama a través de await.
Luego, en mis subclases, anulo este método, pero hay veces que incluye una espera y otras veces que no.
La palabra clave async no es en realidad parte de la firma del método heredado, sino más bien una señal para el compilador de que necesita compilar y reescribir el método de acuerdo con el patrón de los métodos asíncronos.
Como tal, puede omitir la palabra clave async en los métodos heredados si el método heredado no usa la palabra clave await .
Tenga en cuenta que aún tendrá que devolver una Task o Task<T> , esa parte es parte de la firma del método heredado.
Así que esto le dará una advertencia:
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; } }La advertencia es esta:
Advertencia: CS1998 Este método asíncrono carece de operadores de "espera" y se ejecutará de forma síncrona. Considere usar el operador
awaitpara esperar llamadas API que no bloqueen, oawait Task.Run(...)para hacer trabajo vinculado a la CPU en un subproceso en segundo plano.
Esto, sin embargo, no producirá una advertencia:
class Derived : Base { public override Task<int> Method() { return Task.FromResult(42); } } Tenga en cuenta que cambié la declaración de return en ese último método porque parte de la "magia" que trae la palabra clave async es envolver automáticamente el valor de retorno dentro de Task<T> . Si tiene otras formas de obtener una Task<T> , obviamente no necesita envolver el resultado como lo hice anteriormente.