Предположим, что следующий синхронный код:
try
{
Foo();
Bar();
Fubar();
Console.WriteLine("All done");
}
catch(Exception e) // For illustration purposes only. Catch specific exceptions!
{
Console.WriteLine(e);
}
Теперь предположим, что все эти методы имеют аналог Async, и я должен использовать их по какой-то причине, поэтому простое перенос всего объекта в новую задачу не является вариантом.
Как я могу достичь такого же поведения?
Что я имею в виду с "тем же":
- Выполните обработчик для исключения, если вы его выбросите.
- Остановить выполнение следующих методов, если выбрано исключение.
Единственное, что я смог придумать, - ужасно:
var fooTask = FooAsync();
fooTask.ContinueWith(t => HandleError(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
fooTask.ContinueWith(
t =>
{
var barTask = BarAsync();
barTask.ContinueWith(t => HandleError(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
barTask.ContinueWith(
t =>
{
var fubarTask = FubarAsync();
fubarTask.ContinueWith(t => HandleError(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
fubarTask.ContinueWith(
t => Console.WriteLine("All done"),
TaskContinuationOptions.OnlyOnRanToCompletion);
},
TaskContinuationOptions.OnlyOnRanToCompletion);
},
TaskContinuationOptions.OnlyOnRanToCompletion);
Обратите внимание:
- Мне нужно решение, которое работает с .NET 4, поэтому
async/await
не может быть и речи. Однако, если он будет работать сasync/await
, не стесняйтесь показать, как это сделать. - Мне не нужно использовать TPL. Если это невозможно с помощью TPL, другой подход будет в порядке, возможно, с реактивными расширениями?