[c#] Supresión de "advertencia CS4014: como no se espera esta llamada, la ejecución del método actual continúa ..."



Answers

Puede decorar el método con el siguiente atributo:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Await.Warning", "CS4014:Await.Warning")]
static async Task StartWorkAsync()
{
    WorkAsync();
    // ...
}

Básicamente le está diciendo al compilador que sabe lo que está haciendo y que no necesita preocuparse por un posible error.

La parte importante de este código es el segundo parámetro. La parte "CS4014:" es lo que suprime la advertencia. Puedes escribir todo lo que quieras en el resto.

Saludos, Fábio

Question

Esto no es un duplicado de "Cómo llamar sin peligro un método asíncrono en C # sin esperar" .

¿Cómo puedo suprimir bien la siguiente advertencia?

Advertencia CS4014: Debido a que no se espera esta llamada, la ejecución del método actual continúa antes de que se complete la llamada. Considere la posibilidad de aplicar el operador 'esperar' al resultado de la llamada.

Un simple ejemplo:

static async Task WorkAsync()
{
    await Task.Delay(1000);
    Console.WriteLine("Done!");
}

static async Task StartWorkAsync()
{
    WorkAsync(); // I want fire-and-forget 

    // more unrelated async/await stuff here, e.g.:
    // ...
    await Task.Delay(2000); 
}

Lo que probé y no me gustó:

static async Task StartWorkAsync()
{
    #pragma warning disable 4014
    WorkAsync(); // I want fire-and-forget here
    #pragma warning restore 4014
    // ...
}

static async Task StartWorkAsync()
{
    var ignoreMe = WorkAsync(); // I want fire-and-forget here
    // ...
}



El motivo de la advertencia es que WorkAsync devuelve una Tarea que nunca se lee ni espera. Puede establecer que el tipo de devolución de WorkAsync se anule y la advertencia desaparecerá.

Normalmente, un método devuelve una Tarea cuando la persona que llama necesita conocer el estado del trabajador. En el caso de un "olvídate del fuego", el vacío debe devolverse para asemejarse a que la persona que llama es independiente del método llamado.

static async void WorkAsync()
{
    await Task.Delay(1000);
    Console.WriteLine("Done!");
}

static async Task StartWorkAsync()
{
    WorkAsync(); // no warning since return type is void

    // more unrelated async/await stuff here, e.g.:
    // ...
    await Task.Delay(2000); 
}



Mi dos formas de lidiar con esto.

Solo suprímalo

#pragma warning disable es una solución lo suficientemente agradable para "disparar y olvidar".

El motivo por el que existe esta advertencia es porque en muchos casos no es su intención utilizar un método que devuelva la tarea sin esperarla. Suprimir la advertencia cuando tienes la intención de disparar y olvidar tiene sentido.

Si tiene problemas para recordar cómo deletrear #pragma warning disable 4014 , simplemente deje que Visual Studio lo agregue. Presiona Ctrl +. para abrir "Acciones rápidas" y luego "Suprimir CS2014"

Guárdelo en una variable local

Ejemplo

var task = Task.Run(() => DoMyStuff()).ConfigureAwait(false);

Como no hay una llamada a la task posterior, en el modo de lanzamiento, la variable local se debe optimizar de inmediato, como si nunca hubiera existido. De hecho, dudo que el compilador incluso cree la variable local (alguien puede confirmarlo con un decompilador).

Considerándolo todo

Es estúpido crear un método que requiera algunos tics más para ejecutarse, solo con el propósito de suprimir una advertencia.




Links