2013-05-23 11 views
38

Skopiowałem poniżej kod z linku this. Ale kiedy kompiluję ten kod, otrzymuję, że punkt wejścia nie może być oznaczony przez modyfikator "asynchroniczny". Jak mogę sprawić, by ten kod był kompilowany?Punkt wejścia nie może być oznaczony przez modyfikator "asynchroniczny"

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

Nie można oznaczyć 'Main' z asynchronicznym autonomicznym. – Jcl

+0

@JCL: Jak mogę nazwać metodę async/awai w metodzie głównej –

+0

Możesz znaleźć wszystkie informacje o async i czekać na [ten link] (http://msdn.microsoft.com/en-us/library/vstudio/ hh191443.aspx). Nie jestem pewien, czy dobrze rozumiesz tę koncepcję. – Jcl

Odpowiedz

63

Komunikat o błędzie jest dokładnie poprawny: metoda Main() nie może być async, ponieważ po powrocie aplikacji Main() aplikacja zazwyczaj kończy się.

Jeśli chcesz złożyć aplikację konsoli, która używa async, prostym rozwiązaniem jest stworzenie async wersję Main() i synchronicznie Wait() na które od prawdziwego Main():

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

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

Jest to jeden z rzadkich przypadki, w których mieszanie await i Wait() jest dobrym pomysłem, zwykle nie powinno się tego robić.

Aktualizacja: Async Main jest supported in C# 7.1.

+0

wait() is void . jak uzyskać wynik PO OCZEKIWANIU? –

+7

@bilalfazlani Jaki wynik? 'Main()' zwykle nie zwraca niczego. W każdym razie, jeśli masz 'Task ' (tj. 'Task' z wynikiem), możesz użyć' Result' zamiast 'Wait()'. – svick

1

Różnica między kodu z przykładu i waszą tego linku, jest to, że starasz się oznaczyć metodę Main() z krytym async modyfikatora - to nie jest dozwolone, a błąd mówi, że dokładnie - metoda Main() to "punkt wejścia" do aplikacji (jest to metoda, która jest wykonywana, gdy aplikacja się uruchamia) i nie można jej ustawić jako async.

+0

Jak mogę nazwać metodę async/awai w głównej metodzie –

5

Począwszy od C# 7.1 są 4 nowe podpisy dla Main metody, które pozwalają, aby to 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); 

Można oznaczyć metodę Main z async hasła i używania await wewnątrz 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 jest dostępny w Visual Studio 2017 15.3.

0

Wrap kodu asynchronicznego w MainAsync() - która jest funkcją asynchroniczny
następnie wywołać MainAsync().GetAwaiter().GetResult();

Powiązane problemy