Ler em inglês

Partilhar via


Erro do compilador CS4009

«Type.Method»: um ponto de entrada não pode ser marcado com o async modificador.

Não é possível usar a async palavra-chave no ponto de entrada do aplicativo (normalmente o Main método).

Importante

A partir do C# 7.1, o Main método pode ter um async modificador. Para obter mais informações, consulte Valores de retorno principais assíncronos. Para obter informações sobre como selecionar a versão de linguagem C#, consulte o artigo Select the C# language version .

Exemplo

O exemplo a seguir produz 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 corrigir este erro

Atualize a versão da linguagem C# usada pelo projeto para 7.1 ou superior.

Se você usar C# 7.0 ou inferior, remova a async palavra-chave da assinatura do ponto de entrada do aplicativo. Remova também todas as await palavras-chave que você usou para aguardar métodos assíncronos no ponto de entrada do aplicativo.

No entanto, você ainda precisa aguardar a conclusão do método assíncrono antes que seu ponto de entrada retome a execução. Caso contrário, a compilação gera o aviso do compilador CS4014 e o aplicativo será encerrado antes que a operação assíncrona seja concluída. O exemplo a seguir ilustra esse 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 aguardar um método que retorna um Task, chame seu método, como ilustra o exemplo Wait a seguir:

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 aguardar um método que retorna um Task<TResult>, recupere o valor de sua Result propriedade, como faz o exemplo a seguir:

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 também