2016-07-07 4 views
2

Ich habe eine Konsole App und ich möchte Aufgaben nacheinander starten.Task.Wait() wartet nicht auf die Aufgabe zu beenden

Hier ist mein Code:

static void Main() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     Task t = new Task(() => Search(kw)); 
     t.Start(); 
     t.Wait(); 
    } 

    Console.ReadLine(); 
} 

static async void Search(string keyword) 
{ 
    // code for searching 
} 

Das Problem ist, dass es nicht für die erste Aufgabe nicht warten Ausführung zu beenden. Es feuert die nachfolgenden Aufgaben gleichzeitig ab.

Ich arbeite mit einer Rate begrenzt API, also möchte ich nacheinander tun.

Warum wartet es nicht, bis eine Suche beendet ist, bevor die nächste Suche gestartet wird?

+0

Die Suchmethode verwendet einige Methoden das muss asynchron aufgerufen werden und ich habe einen Fehler beim ersten Aufruf bekommen, also habe ich es auf diese Weise versucht und es hat funktioniert. – Guerrilla

+0

Auch verstehen, dieses Verhalten ist perfekt, Sie warten auf Aufgabe, die eine Async-Methode, die ein 'warten 'hätte, die zurückkehrt und' Task Wait' ist getan, so dass Sie nicht beschweren können –

Antwort

10

Ihre async Methode gibt einfach void zurück, was bedeutet, dass es keine einfache Möglichkeit gibt, etwas darauf warten zu müssen. (Sie sollten fast immer vermeiden, async void Methoden zu verwenden. Sie sind wirklich nur für das Abonnieren von Ereignissen verfügbar.) Ihre Aufgabe ruft nur Search, und Sie warten auf das "Ich habe die Methode aufgerufen" zu vervollständigen .. das wird es ziemlich sofort.

Es ist nicht klar, warum Sie async überhaupt verwenden sind, wenn Sie wirklich wollen, die Dinge in Reihe zu tun, aber ich würde Ihr Code empfiehlt Wechsel mehr zu sehen wie folgt aus:

static void Main() 
{ 
    // No risk of deadlock, as a console app doesn't have a synchronization context 
    RunSearches().Wait(); 
    Console.ReadLine(); 
} 

static async Task RunSearches() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     await Search(kw); 
    }    
} 

static async Task Search(string keyword) 
{ 
    // code for searching 
} 
+0

Zusätzlich async void keine Ausnahme konnte die beenden Prozess, der nicht das Verhalten von async ist Aufgabe –

+0

Danke! Die Suchfunktion verwendet einige asynchrone Funktionen und ich habe ein bisschen verwirrt, wie man alles von der Hauptmethode startet. Ich habe meinen Code aktualisiert, wie Sie es vorgeschlagen haben, und es funktioniert jetzt großartig! Vielen Dank, Herr Skeet. – Guerrilla

+0

@ Jon Skeet für Non Console-Anwendung soll dies 'Task.WhenAll' verwenden, um den' Synchronisierungs'-Kontext abzubilden und 'Deadlock' zu vermeiden? –