it-swarm.com.de

Ein Einstiegspunkt kann nicht mit dem Modifikator 'async' markiert werden

Ich habe den Code von this link kopiert. Aber wenn ich diesen Code kompiliere, bekomme ich einen Einstiegspunkt kann nicht mit dem 'async'-Modifikator markiert werden. Wie kann ich diesen Code kompilierbar machen?

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

Die Fehlermeldung ist genau richtig: Die Main()-Methode kann nicht async sein, da die Anwendung normalerweise endet, wenn Main() zurückkehrt.

Wenn Sie eine Konsolenanwendung erstellen möchten, die async verwendet, besteht eine einfache Lösung darin, eine async-Version von Main() und synchron Wait() auf der realen Main() zu erstellen:

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

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

Dies ist einer der seltenen Fälle, in denen das Mischen von await und Wait() eine gute Idee ist. Sie sollten dies normalerweise nicht tun.

Update : Async Main wird in C # 7.1 unterstützt.

69
svick

Ab C # 7.1 gibt es 4 neue Signaturen für die Main-Methode, die es ermöglichen, async zu machen ( 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);

Sie können Ihre Main-Methode mit dem Schlüsselwort async markieren und await innerhalb von Main verwenden:

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 ist in Visual Studio 2017 15.3 verfügbar.

10
Roman Doskoch

Der Unterschied zwischen dem Code im Link-Beispiel und Ihrem Code besteht darin, dass Sie versuchen, die Main()-Methode mit einem async-Modifikator zu markieren. Dies ist nicht zulässig, und der Fehler sagt genau das - die Main()-Methode ist der "Einstiegspunkt" die Anwendung (es ist die Methode, die ausgeführt wird, wenn Ihre Anwendung gestartet wird), und es darf nicht async sein.

1
Igal Tabachnik

Wickeln Sie Ihren asynchronen Code in MainAsync() ein. Hierbei handelt es sich um eine asynchrone Funktion
dann rufen Sie MainAsync().GetAwaiter().GetResult(); auf

0