Ler em inglês

Compartilhar via


Erro do Compilador CS4009

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

Você não pode usar a palavra-chave async no ponto de entrada do aplicativo (normalmente, o método Main).

Importante

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

Exemplo

O exemplo a seguir produz o 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 palavra-chave async da assinatura do ponto de entrada do aplicativo. Remova também as palavras-chave await usadas 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 o ponto de entrada retome a execução. Caso contrário, a compilação gerará o aviso do compilador CS4014 e o aplicativo será encerrado antes da conclusão da operação assíncrona. 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 Wait, como ilustra o seguinte exemplo:

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 propriedade Result, como 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

Confira também