コンパイラ エラー 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
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。