Точка входа не может быть отмечена модификатором 'async'
Я скопировал ниже код из этой ссылки. Но когда я компилирую этот код, я получаю точку входа не может быть помечен модификатором 'async'. Как я могу сделать этот код компилируемым?
class Program
{
static async void Main(string[] args)
{
Task<string> getWebPageTask = GetWebPageAsync("http://msdn.microsoft.com");
Debug.WriteLine("In startButton_Click before await");
string webText = await getWebPageTask;
Debug.WriteLine("Characters received: " + webText.Length.ToString());
}
private static async Task<string> GetWebPageAsync(string url)
{
// Start an async task.
Task<string> getStringTask = (new HttpClient()).GetStringAsync(url);
// Await the task. This is what happens:
// 1. Execution immediately returns to the calling method, returning a
// different task from the task created in the previous statement.
// Execution in this method is suspended.
// 2. When the task created in the previous statement completes, the
// result from the GetStringAsync method is produced by the Await
// statement, and execution continues within this method.
Debug.WriteLine("In GetWebPageAsync before await");
string webText = await getStringTask;
Debug.WriteLine("In GetWebPageAsync after await");
return webText;
}
// Output:
// In GetWebPageAsync before await
// In startButton_Click before await
// In GetWebPageAsync after await
// Characters received: 44306
}
Ответы
Ответ 1
Сообщение об ошибке точно: метод Main()
не может быть async
, потому что когда Main()
возвращается, приложение обычно заканчивается.
Если вы хотите создать консольное приложение, использующее async
, простым решением является создание версии async
Main()
и синхронно Wait()
по сравнению с реальным Main()
:
static void Main()
{
MainAsync().Wait();
}
static async Task MainAsync()
{
// your async code here
}
Это один из редких случаев, когда смешивание await
и Wait()
является хорошей идеей, вы обычно не должны этого делать.
Обновить: Async Main поддерживается в С# 7.1.
Ответ 2
Начиная с С# 7.1 существует 4 новых подписи для метода Main
, которые позволяют сделать это async
(Источник, Источник 2, Источник 3):
public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);
Вы можете пометить свой метод Main
ключевым словом async
и использовать await
внутри Main
:
static async Task Main(string[] args)
{
Task<string> getWebPageTask = GetWebPageAsync("http://msdn.microsoft.com");
Debug.WriteLine("In startButton_Click before await");
string webText = await getWebPageTask;
Debug.WriteLine("Characters received: " + webText.Length.ToString());
}
С# 7.1 доступен в Visual Studio 2017 15.3.
Ответ 3
Разница между кодом в примере ссылки и вашим заключается в том, что вы пытаетесь пометить метод Main()
с помощью модификатора async
- это недопустимо, и ошибка говорит о том, что точно - Main()
- это "точка входа" в приложение (это метод, который выполняется при запуске вашего приложения), и ему не разрешено быть async
.