Сохранить исключение при продолжении задачи

У меня есть задача :

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)
{
    ...
}
10
задан dtb 1 December 2010 в 21:21
поделиться