2013-04-24 9 views
5

Ich möchte Initialisierungen einiger Objekte asynchron ausführen, aber einige Objekte hängen davon ab, dass andere initialisiert werden. Und dann müssen alle Objekte initialisiert werden, bevor der Rest meiner Anwendung fortfährt.Können Sie Wait() für eine Aufgabe mehrmals aufrufen?

Ist es möglich, Wait() für eine Aufgabe aufzurufen und später Wait() erneut aufzurufen, oder wie in meinem Beispiel WaitAll() für eine Sammlung, in der es enthalten ist?

Dictionary<String, Task> taskdict = new Dictionary<String, Task>(); 

    taskdict.Add("Task1", 
     Task.Factory.StartNew(() => { 
     //Do stuff 
     })); 

    taskdict.Add("Task2", 
     Task.Factory.StartNew(() => { 
      taskdict[ "Task1" ].Wait(); 

     //Do stuff 

     })); 

     try { 
     Task.WaitAll(taskdict.Values.Convert<Task[ ]>()); 
     } 

Oder wird das zweite Wait()/WaitAll() fehlschlagen?

Antwort

18

Sie können sicherlich auf eine Aufgabe zweimal warten. Sie können auf eine Aufgabe so oft warten, wie Sie möchten, ohne negative Nebenwirkungen. Nun, wenn Sie bereits auf eine Aufgabe in demselben Thread gewartet haben, wird es bereits erledigt sein, so dass die zukünftigen Wait Aufrufe alle sofort zurückkehren werden, da es nichts zu warten gibt, aber sie werden sicherlich nicht fehlschlagen oder auf andere Weise unangemessen produzieren Ergebnisse.

Beachten Sie, dass, wenn eine Aufgabe normalerweise nicht abschließen und wurde stattdessen abgebrochen oder konnte nicht als Ergebnis einer Ausnahme dann wird beenden geworfen Aufruf Wait wird die Ausnahme erneut werfen (jedes Mal, wenn Sie Wait nennen). Wenn Wait Ausnahmen für Sie auslöst, besteht die Möglichkeit, dass dies der Grund ist.

+1

Danke für eine klare Antwort. Und für Details zur Ausnahmebehandlung. Das ist ein wichtiges Thema, das ich berücksichtigen muss. –

+0

@Servy was ist, wenn ich möchte, dass die Aufgabe erneut ausgeführt wird, bei zweiter Wartezeit. Wie kann ich das Task-Ergebnis ungültig machen? –

+0

@ MerdanGochmuradov Sie können nicht. So funktionieren Aufgaben nicht. – Servy