Подтвердить что ты не робот

Точка входа не может быть отмечена модификатором '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
}
4b9b3361

Ответ 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.