У меня есть задача
Task<A> someTask = ...
Эта задача может привести к успеху, ошибке или отмене.
I хотите преобразовать результат, когда задача успешна, и сохранить результат, если нет.
Это кажется действительно сложным, когда someTask
выдает исключение.
Что я пробовал:
Task<B> resultTask = StartMyTask().ContinueWith<B>(
t => Foo(t.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);
Это приводит к отмене resultTask
, если someTask
неисправностей. Я хочу, чтобы он неисправен.
Task<B> resultTask = StartMyTask().ContinueWith<B>(
t => Foo(t.Result));
Это ломается в отладчик Visual Studio, потому что .Result
вызывает исключение. Если я нажму F5, resultTask
выдаст ошибку, как и ожидалось, но от этого будет неприятный запах.
Есть ли способ позволить resultTask
иметь тот же результат, что и someTask
, если someTask
сбоев?
По сути, я пытаюсь выразить что-то вроде этого с помощью задач:
int F()
{
throw new SomeException();
}
string G(int x)
{
return x.ToString();
}
try
{
string result = G(F());
}
catch (SomeException e)
{
...
}