web-dev-qa-db-fra.com

Un point d'entrée ne peut pas être marqué avec le modificateur 'async'

J'ai copié le code ci-dessous depuis this link.Mais lorsque je compile ce code, je reçois un point d'entrée ne peut pas être marqué avec le modificateur 'asynchrone' . Comment puis-je rendre ce code compilable?

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
}
42
user2408588

Le message d'erreur est tout à fait exact: la méthode Main() ne peut pas être async, car lorsque Main() est renvoyé, l'application se termine généralement.

Si vous souhaitez créer une application console utilisant async, une solution simple consiste à créer une version async de Main() et de manière synchrone Wait() à partir de la fonction réelle Main():

static void Main()
{
    MainAsync().Wait();
}

static async Task MainAsync()
{
    // your async code here
}

C’est l’un des rares cas où le mélange de await et Wait() est une bonne idée, vous ne devriez généralement pas le faire.

Update : Async Main est pris en charge en C # 7.1 .

69
svick

Depuis la version 7.1, il y a 4 nouvelles signatures pour la méthode Main qui permettent de la rendre async ( Source , Source 2 , Source 3 ):

public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);

Vous pouvez marquer votre méthode Main avec le mot clé async et utiliser await dans 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()); 
}

C # 7.1 est disponible dans Visual Studio 2017 15.3.

10
Roman Doskoch

La différence entre le code de l'exemple de lien et le vôtre est que vous essayez de marquer la méthode Main() avec un modificateur async - ceci n'est pas autorisé, et l'erreur indique exactement - la méthode Main() est le "point d'entrée" de l'application (c'est la méthode qui est exécutée au démarrage de votre application), et il n'est pas permis à async.

1
Igal Tabachnik

Enveloppez votre code asynchrone dans MainAsync() - qui est une fonction async
puis appelez MainAsync().GetAwaiter().GetResult();

0
Turja Chaudhuri IN