2013-05-23 5 views
38

I unten Code aus this link.But kopiert markiert werden, wenn ich diesen Code bin kompilieren Ich bin ein Einstiegspunkt bekommen kann nicht mit dem ‚async‘ Modifikator markiert werden. Wie kann ich diesen Code kompilierbar machen?Ein Einstiegspunkt kann nicht mit dem ‚async‘ Modifikator

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

Sie nicht 'Main' mit Asynchron benoten. – Jcl

+0

@JCL: Wie kann ich async/awai Methode in der Hauptmethode –

+0

aufrufen Sie können alle Informationen über async finden und auf [diesen Link] erwarten (http://msdn.microsoft.com/en-us/library/vstudio/ hh191443.aspx). Ich bin mir nicht sicher, ob Sie das Konzept richtig verstanden haben. – Jcl

Antwort

63

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

Wenn Sie eine Konsolenanwendung machen, die async verwendet, eine einfache Lösung ist es, eine async Version von Main() und synchron Wait() auf, dass aus den realen Main() zu erstellen:

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

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

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

Aktualisieren: Async Main ist supported in C# 7.1.

+0

wait() ist void . Wie bekomme ich das Ergebnis nach dem Warten? –

+7

@bilalfazlani Was für ein Ergebnis? 'Main()' gibt normalerweise nichts zurück. In jedem Fall, wenn Sie eine 'Task ' haben (d. H. 'Task' mit einem Ergebnis), können Sie 'Result' anstelle von' Wait() 'verwenden. – svick

1

Die Differenz zwischen dem Code in dem Beispiel der Verbindung und bei Ihnen, dass Sie versuchen, die Main() Methode mit einem async Modifikator markieren - das ist nicht erlaubt ist, und der Fehler sagt, dass genau - die Main() Methode ist der "Einstiegspunkt" der Anwendung (es ist die Methode, die beim Starten Ihrer Anwendung ausgeführt wird) und darf nicht async sein.

+0

Wie kann ich async/awai-methode in main-methode –

5

Ausgehend von C# 7.1 gibt es 4 neue Signaturen für Main Verfahren, die es erlauben, 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); 

Sie können Ihre Main Methode mit async Schlüsselwort markieren und await innen verwenden 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 ist in Visual Studio verfügbar 2017 15.3.

0

Ihre async Code in MainAsync() Wrap - die dann eine Asynchron-Funktion ist
nennen MainAsync().GetAwaiter().GetResult();

Verwandte Themen