Прочитать на английском

Поделиться через


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

Type.Method: точка входа не может быть помечена модификатором async .

Вы не можете использовать async ключевое слово в точке входа приложения (как правило, Main метод).

Важно!

Начиная с C# 7.1 Main метод может иметь async модификатор. Дополнительные сведения см. в разделе Async main return values. Сведения о выборе версии языка C# см . в статье "Выбор версии языка C#".

Пример

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

Исправление ошибки

Обновите языковую версию C#, используемую проектом до версии 7.1 или более поздней.

Если вы используете C# 7.0 или более поздней версии, удалите async ключевое слово из подписи точки входа приложения. Также удалите все await ключевое слово, которые вы использовали для ожидания асинхронных методов в точке входа приложения.

Однако до возобновления выполнения точки входа необходимо дождаться завершения асинхронного метода. В противном случае компиляция создает предупреждение компилятора CS4014 и приложение завершится до завершения асинхронной операции. В следующем примере показана эта проблема:

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 метод, как показано в следующем примере:

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 , как показано в следующем примере:

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

См. также