2017-12-07 3 views
-3

Ich habe eine Liste von Aufgaben, die einen Webservice neu starten wird. Ich beginne die Ausführung von ihnen beim Aufruf downloadTasksQuery.ToList(). An diesem Punkt möchte ich jede Aufgabe so bearbeiten, wie sie fertig ist, und die Entfernung zur Datenbank hinzufügen, sobald sie fertig ist..Net Core Async Warten wird nicht ausgeführt Ausführung

Wenn ich das in der Konsole anschaue. Alle Aufzeichnungen scheinen gleichzeitig auf der Konsole zu drucken, und ich sehe das Ergebnis aus dieser Zeile. Console.WriteLine(" Google Distance : " + d.google_distance);

Die Anzahl der Ausdrucke auf der Konsole ist die Nummer, die in der Liste der Aufgaben zu Beginn war.

IEnumerable<Task<Distances>> downloadTasksQuery = 
    (from tup in urlList select ProcessURL(tup)); 

List<Task<Distances>> downloadTasks = downloadTasksQuery.ToList(); 

while (downloadTasks.Count > 0) 
{ 
    Task<Distances> thisFinished = await Task.WhenAny(downloadTasks); 

    downloadTasks.Remove(thisFinished); 
    try 
    { 
     Distances d = await thisFinished; 
     if (d.has_error == false) 
     { 
      dr.Add(d); 
     } 
     else 
     { 
      dr.AddError(d); 
     } 
     Console.WriteLine(" Google Distance : " + d.google_distance); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Deleted task, did not save data"); 
    } 
} 

Prozess URL

private static async Task<Distances> ProcessURL(Tuple<string, int, string> tup) 
{ 
    HttpClient client = new HttpClient(); 
    Distances d = new Distances(); 
    try 
     { 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); 
       //// Post is required by the web api 
      var stringTask = client.PostAsync("https://website.com" + tup.Item1, new StringContent("null")); 

      var msg2 = await stringTask.Result.Content.ReadAsStringAsync(); 
      d = FromXml<Distances>(msg2.Trim()); 

     } 

    catch (Exception e) 
     { 
      d.has_error = true; 
     } 
    d.state_student_identifier = tup.Item3; 
    d.student_transportation_id = tup.Item2; 
    return d; 
} 
+4

Gibt es was bedeutet 'ProcessURL' machen? Bitte geben Sie eine [MCVE] an. –

+0

@JonSkeet Ich habe mehr Details zur Verfügung gestellt. –

+0

Dies scheint für ContinueWith besser geeignet zu sein –

Antwort

0

würde ich vorschlagen, die Verwendung ContinueWith wie es besser geeignet scheint für das, was Sie zu tun versuchen:

var runningTasks = urlList.Select(tup => ProcessURL(tup) 
    .ContinueWith(task => 
    { 
     var d = task.Result; 
     if (d.has_error) 
      dr.AddError(d); 
     else 
      dr.Add(d); 
     Console.WriteLine(" Google Distance : " + d.google_distance); 
    })); 
await Task.WhenAll(runningTasks); 
Verwandte Themen