Я много читал о том, как обрабатывать исключения в TPL, но на самом деле не понимаю.Исключение обработки в Tpl
Давайте этот пример кода:
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);
}
я ожидал, чтобы напечатать
Catch 1
Continuation
Но я получаю
Catch 1
Continuation
Wait Exception
Это означает, что исключение по-прежнему считается необработанной, когда задача завершается, и финализатор задачи в конечном итоге снесет приложение.
Как обработать исключение внутри продолжения, чтобы финализатор не выбрал? В то же время я хочу, чтобы задача оставалась в неисправном состоянии, поэтому перенос задачи в try/catch не будет работать.
фона, что я хочу, чтобы реализовать шаблон событий асинхронных, как указано here, но с обработкой ошибок. Мой полный код выглядит следующим образом
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;
}
Я думал о вызове 't.Wait()' в попытке продолжения и игнорирования исключения. Но это не сработает, потому что продолжение может быть выполнено после другого 'Wait()' throws. – svick