2016-03-25 4 views
0

Ich versuche zu verstehen, wo ich Try/Catch-Blöcke verwenden muss. Ist es sicher, nur einen try/catch um Task.WaitAll() unten zu legen, oder muss ich jeden Task mit einem try/catch, sowie dem Task.WaitAll() umgeben?C# Aufgabe, wo muss ich eine SystemAggregateException abfangen

Task<SomeResult> myTask1 = DoSomethingAsync1(); 
myTask1.ContinueWith(x => 
{ 
    // Do something here; 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 

Task<SomeResult> myTask2 = DoSomethingAsync2(); 
myTask2.ContinueWith(x => 
{ 
    // Do something here; 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 

// Some other code that executes while these tasks are running 
Console.WriteLine("Hello World"); 

Task.WaitAll(myTask1, myTask2); 

Antwort

0

Das Erstellen einer Aufgabe wird keine Ausnahme auslösen. Die Ausnahmebehandlung wird beim Abrufen von Informationen durchgeführt, wenn Sie auf Ergebnisse warten. Und dies ist der richtige Ort, um Ausnahmen zu behandeln und der einzige Ort, an dem Sie sich darum kümmern sollten.

+0

Aber eine Fortsetzungsaufgabe kann das Ergebnis einer Aufgabe ('x.Result') verwenden. Wenn ich diesen Fortsetzungsaufgaben einen Namen ("contTask1, contTask2") geben würde und nur "Task.WaitAll" (contTask1, contTask2) umgeben wäre, würde '' mit einem try/catch nicht auf 'x.result' innerhalb einer Fortsetzungsaufgabe zugreifen in der Lage sein, eine Ausnahme zu werfen? – blgrnboy

+0

@blgrnboy Sie stellen dort einen Delegierten zur Verfügung. Sie rufen diesen Code gerade nicht in dem Moment auf, in dem er ausgeführt wird. Es wird auf einem anderen Thread ausgeführt und Sie erhalten das Ergebnis davon, wenn Sie es warten. Fortsetzen bedeutet, dass Sie sagen, was nach Abschluss eines Teils der Berechnung ausgeführt werden soll, ohne sich darum zu kümmern, ob es erfolgreich ist oder nicht. Sie werden es später finden, wenn Sie es abwarten. – greenshade

+0

@blgrnboy Ja, es wird eine Ausnahme ausgelöst, aber Sie erfassen es nur, wenn Sie eine Aufgabe warten. – greenshade

Verwandte Themen