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
}
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.
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.
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.
Wickeln Sie Ihren asynchronen Code in MainAsync()
ein. Hierbei handelt es sich um eine asynchrone Funktion
dann rufen Sie MainAsync().GetAwaiter().GetResult();
auf