Leggere in inglese

Condividi tramite


Errore del compilatore CS4009

"Type.Method": un punto di ingresso non può essere contrassegnato con il modificatore async.

Non è possibile usare la parola chiave async nel punto di ingresso dell'applicazione (in genere il metodo Main).

Importante

A partire da C# 7.1, il metodo Main può avere un modificatore async. Per altre informazioni, vedere Principali valori asincroni restituiti. Per informazioni su come selezionare la versione del linguaggio C#, vedere l'articolo Selezionare la versione del linguaggio C#.

Esempio

L'esempio seguente produce l'errore 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");
    }
}

Per correggere l'errore

Aggiornare la versione del linguaggio C# usata dal progetto alla versione 7.1 o successiva.

Se si usa C# 7.0 o versione precedente, rimuovere la parola chiave async dalla firma del punto di ingresso dell'applicazione. Rimuovere anche qualsiasi parola chiave await usata per attendere i metodi asincroni nel punto di ingresso dell'applicazione.

Tuttavia, è comunque necessario attendere il completamento del metodo asincrono prima che il punto di ingresso riprenda l'esecuzione. In caso contrario, la compilazione genera l'avviso del compilatore CS4014 e l'applicazione terminerà prima del completamento dell'operazione asincrona. L'esempio seguente illustra questo 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

Per attendere un metodo che restituisce un oggetto Task, chiamare il relativo metodo Wait, come illustrato nell'esempio seguente:

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

Per attendere un metodo che restituisce un Task<TResult>, recuperare il valore della relativa proprietà Result, come nell'esempio seguente:

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

Vedi anche