2017-07-03 5 views
0

abgeschlossen Ich möchte Sie fragen: Ich habe Code:Assign Eigenschaft, wenn Task-

var task1 = await _connectionService.ValidateUriAsync(uri1); 
     OutputResult("ss", task1); 
     var task2 = await _connectionService.ValidateUriAsync(uri2); 
     OutputResult("bb", task2); 
     var task3 = await _connectionService.ValidateUriAsync(uri3); 
     OutputResult("cc", task3); 

Nun, bis jede Aufgabe beendet Ich warte und dann ausgegeben ich das Ergebnis. Aber ich möchte alle Aufgaben unabhängig ausführen (ich weiß, wie das geht). Aber was ich nicht weiß ist, wenn eine Aufgabe abgeschlossen ist, muss ich Ergebnis für jede Aufgabe ausgeben. Wenn die Aufgabe fehlschlägt, wird die Ausgabe - task1 fehlgeschlagen oder Task1 erfolgreich sein. Ich habe diese Lösung versucht, aber ich muss überprüfen, welche Aufgabe abgeschlossen ist und als sein Ergebnis (richtig/falsch). Es ist komplex. Wenn ich 100 Aufgaben hatte, kann ich nicht 100 Bedingungen haben.

var tasks = new[] {task1, task2, task3}; 

     var process = tasks.Select(async task => 
     { 
      var result = await task; 
      if(task == task1)assign property 

     }); 

     await Task.WhenAll(proces); 

EDIT: Hier ValidateUriAsync func:

public async Task<bool> ValidateUriAsync(Uri uri) 
    { 
     try 
     { 
      var request = WebRequest.CreateHttp(uri); 
      var result = await request.GetResponseAsync(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 
    } 
+0

Sind die Ergebnisse aller Aufgaben vom selben Typ? – Default

+0

Ja. ValidateUriAsync gibt true/false zurück. – JuP

+0

Könnten Sie einen Ausschnitt davon zeigen, wie Sie Ihre Aufgaben heute erstellen (ich nehme an, Sie haben nicht 100 Codezeilen, die 'var task_n = erwarten _co ... Async (uri_n)') machen? – Default

Antwort

2

wenn einige Aufgabe, die ich für jede Aufgabe zu Ausgabeergebnis müssen abgeschlossen ist.

Denken Sie nicht darüber in Bezug auf "reagieren auf Aufgaben, wie sie abgeschlossen sind". Denken Sie stattdessen an Ihre ValidateUriAsync Methode als "Operation", und was Sie wollen, ist eine neue übergeordnete "Operation" zu erstellen, die "validieren und zuweisen" ist.

Mit dieser Einstellung ist die Lösung mehr klar - ein neues async Verfahren für den neuen Betrieb vorstellen:

private async Task ValidateAndOutputResult(Uri uri, string name) 
{ 
    var result = await _connectionService.ValidateUriAsync(uri); 
    OutputResult(name, result); 
} 

Jetzt können Sie die übergeordnete Methode aufrufen und verwenden Task.WhenAll:

var tasks = new[] 
{ 
    ValidateAndOutputResult(uri1, "ss"), 
    ValidateAndOutputResult(uri2, "bb"), 
    ValidateAndOutputResult(uri3, "cc"), 
}; 
await Task.WhenAll(tasks); 
+0

Vielen Dank für Ihre Antwort. Ja, das ist eine Option. Aber was ist, wenn ich das Ergebnis an die Eigenschaft binden muss und dann die Wertanzeige auf der Benutzeroberfläche? Ich habe darüber nachgedacht, Ref-Parameter in der ValidateUriAsync-Methode zu verwenden, Ref/Out-Parameter sind jedoch nicht mit "Warten/Asynchron" zulässig. – JuP

+0

Wenn Sie meinen, dass jeder URI über eine * separate * -Eigenschaft verfügt, können Sie einen Delegaten an ValidateAndOutputResult übergeben (z. B. "Aktion "), der die entsprechende Eigenschaft aktualisiert. –

+0

Danke Stephen, ich werde es versuchen :) – JuP