Ich habe viel gelesen, wie mit Ausnahmen in TPL umzugehen, aber nicht wirklich verstehen.handling exception in Tpl
Hier können Sie dieses Beispiel-Code nehmen:
var task1 = new Task(() => { throw new Exception("Throw 1"); });
var task2 = task1.ContinueWith(t => Console.WriteLine("Catch 1:{0}", t.Exception.Message),
TaskContinuationOptions.OnlyOnFaulted);
var task3 = task2.ContinueWith(t => Console.WriteLine("Continuation"));
task1.Start();
try {
task1.Wait();
}
catch (Exception ex) {
Console.WriteLine("Wait Exception: {0}", ex.Message);
}
ich diese
Catch 1
Continuation
Aber ich
Catch 1
Continuation
Wait Exception
wenn Dies bedeutet, dass die Ausnahme als nicht behandelte noch erhalten drucken erwartet die Aufgabe wird abgeschlossen, und der Aufgabenfinalisierer wird die Anwendung schließlich abreißen.
Wie gehe ich mit der Ausnahme in der Fortsetzung um, damit der Finalizer nicht geworfen wird? Gleichzeitig möchte ich, dass die Aufgabe im fehlerhaften Zustand bleibt, so dass die Aufgabe in try/catch nicht funktioniert.
Der Hintergrund ist, dass ich von der Asynchron-Ereignismuster implementieren möchten als here angegeben, aber mit Fehlerbehandlung. Meine vollständige Code sieht wie folgt aus
public IAsyncResult Begin(AsyncCallback callback, object state, Action action) {
var task1 = new Task(action);
var task2 = task1.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
if (callback != null) {
var task3 = task2.ContinueWith(t => callback(t),
TaskScheduler.FromCurrentSynchronizationContext());
var task4 = task3.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
}
task1.Start();
return task;
}
Ich dachte darüber nach, 't.Wait()' in einem Versuch in der Fortsetzung zu nennen und die Ausnahme zu ignorieren. Aber das wird nicht funktionieren, weil die Fortsetzung ausgeführt werden kann, nachdem das andere 'Wait()' wirft. – svick