Leer en inglés

Compartir a través de


Error del compilador CS4009

'Type.Method': no se puede marcar un punto de entrada con el modificador async.

No se puede usar la palabra clave async en el punto de entrada de la aplicación (normalmente el método Main).

Importante

A partir de C# 7.1, el método Main puede tener un modificador async. Para más información, vea Valores devueltos asincrónicos de Main. Para información sobre cómo seleccionar la versión del lenguaje C#, consulte el artículo Control de versiones del lenguaje C#.

Ejemplo

El ejemplo siguiente genera el error CS4009:

using System;
using System.Threading.Tasks;

public class Example
{
    public static async void Main()
    {
        Console.WriteLine("About to wait two seconds");
        await WaitTwoSeconds();
        Console.WriteLine("About to exit the program");
    }

    private static async Task WaitTwoSeconds()
    {
        await Task.Delay(2000);
        Console.WriteLine("Returning from an asynchronous method");
    }
}

Para corregir este error

Actualice la versión del lenguaje C# usada por el proyecto a la versión 7.1 o posterior.

Si usa C# 7.0 o inferior, quite la palabra clave async de la firma del punto de entrada de la aplicación. Quite también las palabras clave await que haya usado para esperar métodos asincrónicos en el punto de entrada de la aplicación.

Pero todavía tiene que esperar a que el método asincrónico se complete antes de que el punto de entrada reanude la ejecución. De lo contrario, la compilación genera la advertencia del compilador CS4014 y la aplicación finalizará antes de que se complete la operación asincrónica. El ejemplo siguiente ilustra este problema:

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       Console.WriteLine("About to wait two seconds");
       WaitTwoSeconds();
       Console.WriteLine("About to exit the program");
   }

   private static async Task WaitTwoSeconds()
   {
      await Task.Delay(2000);
      Console.WriteLine("Returning from an asynchronous method");
   }
}
// The example displays the following output:
//       About to wait two seconds
//       About to exit the program

Para esperar un método que devuelve Task, llame a su método Wait, como se muestra en el ejemplo siguiente:

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       Console.WriteLine("About to wait two seconds");
       WaitTwoSeconds().Wait();
       Console.WriteLine("About to exit the program");
   }

   private static async Task WaitTwoSeconds()
   {
      await Task.Delay(2000);
      Console.WriteLine("Returning from an asynchronous method");
   }
}
// The example displays the following output:
//       About to wait two seconds
//       Returning from an asynchronous method
//       About to exit the program

Para esperar a un método que devuelve Task<TResult>, recupere el valor de su propiedad Result, como hace el ejemplo siguiente:

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
       Console.WriteLine("About to wait two seconds");
       int value = WaitTwoSeconds().Result;
       Console.WriteLine($"Value returned from the async operation: {value}");
       Console.WriteLine("About to exit the program");
   }

   private static async Task<int> WaitTwoSeconds()
   {
      await Task.Delay(2000);
      Console.WriteLine("Returning from an asynchronous method");
      return 100;
   }
}
// The example displays the following output:
//       About to wait two seconds
//       Returning from an asynchronous method
//       Value returned from the async operation: 100
//       About to exit the program

Consulte también