Ошибка компилятора CS4009Compiler Error CS4009

"Type. Method": точка входа не может быть помечена async модификатором.'Type.Method': an entry point cannot be marked with the async modifier.

Нельзя использовать async ключевое слово в точке входа приложения (обычно это Main метод).You cannot use the async keyword in the application entry point (typically the Main method).

Важно!

Начиная с C# 7,1, Main метод может иметь async модификатор.Starting with C# 7.1, the Main method can have an async modifier. Дополнительные сведения см. в разделе асинхронный основной раздел статьи новые возможности в C# 7 .For more information, see the Async main section of the What's new in C# 7 article. Сведения о том, как выбрать версию языка C#, см. в статье Выбор версии языка c# .For information about how to select the C# language version, see the Select the C# language version article.

ПримерExample

В следующем примере создается CS4009:The following example produces 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");
    }
}

Исправление ошибкиTo correct this error

Обновите версию языка C# , используемую проектом, до 7,1 или более поздней версии.Update the C# language version used by the project to 7.1 or higher.

Если используется C# 7,0 или более ранняя версия, удалите async ключевое слово из сигнатуры точки входа приложения.If you use C# 7.0 or lower, remove the async keyword from the signature of the application entry point. Также удалите все await Ключевые слова, которые использовались для ожидания асинхронных методов в точке входа приложения.Also remove any await keywords you've used to await asynchronous methods in your application entry point.

Однако по-прежнему необходимо дождаться завершения асинхронного метода до того, как точка входа возобновит выполнение.However, you still have to wait for the asynchronous method to complete before your entry point resumes execution. В противном случае компиляция создает предупреждение компилятора CS4014, и приложение будет завершено до завершения асинхронной операции.Otherwise, compilation generates compiler warning CS4014, and the application will terminate before the asynchronous operation completes. В следующем примере показана эта проблема.The following example illustrates this problem:

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

Чтобы ожидать метод, возвращающий Task , вызовите его Wait метод, как показано в следующем примере:To await a method that returns a Task, call its Wait method, as the following example illustrates:

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

Чтобы ожидать метод, возвращающий Task<TResult> , извлеките значение его Result свойства, как показано в следующем примере:To await a method that returns a Task<TResult>, retrieve the value of its Result property, as the following example does:

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 aynnc 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 aynnc operation: 100
//       About to exit the program

См. такжеSee also