Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Błąd kompilatora CS4009

"Type.Method": nie można oznaczyć punktu wejścia modyfikatorem async .

Nie można użyć async słowa kluczowego w punkcie wejścia aplikacji (zazwyczaj Main metody).

Ważne

Począwszy od języka C# 7.1, Main metoda może mieć async modyfikator. Aby uzyskać więcej informacji, zobacz Async main return values (Asynchroniczne główne wartości zwracane). Aby uzyskać informacje na temat wybierania wersji języka C#, zobacz artykuł Select the C# language version (Wybieranie wersji języka C#).

Przykład

Poniższy przykład tworzy 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");
    }
}

Aby poprawić ten błąd

Zaktualizuj wersję języka C# używaną przez projekt do wersji 7.1 lub nowszej.

Jeśli używasz języka C# 7.0 lub niższego, usuń async słowo kluczowe z podpisu punktu wejścia aplikacji. Usuń również wszystkie await słowa kluczowe, których użyto do oczekiwania na metody asynchroniczne w punkcie wejścia aplikacji.

Jednak nadal musisz poczekać na ukończenie metody asynchronicznej, zanim punkt wejścia wznowi wykonywanie. W przeciwnym razie kompilacja generuje ostrzeżenie kompilatora CS4014, a aplikacja zakończy się przed zakończeniem operacji asynchronicznej. Poniższy przykład ilustruje ten 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

Aby oczekiwać na metodę zwracającą metodę Task, wywołaj jej Wait metodę, jak pokazano w poniższym przykładzie:

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

Aby zaczekać na metodę zwracającą Task<TResult>element , pobierz wartość jej Result właściwości, jak w poniższym przykładzie:

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

Zobacz też