英語で読む

次の方法で共有


コンパイラ エラー CS4009

'Type.Method': エントリ ポイントに async 修飾子を指定することはできません。

アプリケーション エントリ ポイント (通常は Main メソッド) で async キーワードを使用することはできません。

重要

C# 7.1 以降では、Main メソッドに async 修飾子を指定できます。 詳細については、「非同期 Main の戻り値」を参照してください。 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

関連項目