Číst v angličtině

Sdílet prostřednictvím


Chyba kompilátoru CS4009

'Type.Method': Vstupní bod nelze označit modifikátorem async .

Klíčové slovo nelze použít async v vstupním bodě aplikace (obvykle metodu Main ).

Důležité

Počínaje jazykem C# 7.1 Main může async mít metoda modifikátor. Další informace najdete v tématu Asynchronní hlavní návratové hodnoty. Informace o tom, jak vybrat jazykovou verzi jazyka C#, najdete v článku o výběru jazykové verze jazyka C#.

Příklad

Následující příklad vytvoří 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");
    }
}

Oprava této chyby

Aktualizujte jazykovou verzi jazyka C# používanou projektem na verzi 7.1 nebo vyšší.

Pokud používáte C# 7.0 nebo nižší, odeberte async klíčové slovo z podpisu vstupního bodu aplikace. Odeberte také všechna await klíčová slova, která jste použili k očekávání asynchronních metod v vstupním bodu aplikace.

Přesto ale musíte počkat, až se asynchronní metoda dokončí, než vstupní bod obnoví provádění. Jinak kompilace generuje upozornění kompilátoru CS4014 a aplikace se ukončí před dokončením asynchronní operace. Následující příklad ukazuje tento problém:

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

Pokud chcete očekávat metodu, která vrací metodu Task, zavolejte její Wait metodu, jak ukazuje následující příklad:

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

Chcete-li očekávat metodu, která vrací Task<TResult>, načtěte hodnotu jeho Result vlastnosti, jak je znázorněno v následujícím příkladu:

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

Viz také