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 .
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");
}
}
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
Comentários do .NET
O .NET é um projeto código aberto. Selecione um link para fornecer comentários: