Я не знаю, неправильно ли я думаю о TPL, но мне трудно понять, как получить следующее:
У меня есть две функции
Task<A> getA() { ... }
Task<B> getB(A a) { ... }
Кажется, что это часто происходит: я могу асинхронно получить A. И, получив оценку A, я могу асинхронно получить B.
Я не могу понять, как правильно связать эти функции вместе в TPL.
Вот одна попытка:
Task<B> Combined()
{
Task<A> ta = getA();
Task<Task<B>> ttb = ta.ContinueWith(a => getB(a.Result));
return ttb.ContinueWith(x => x.Result.Result);
}
Я запутался в ContinueWith
. Возвращаемый тип - «двойная задача», Task
. Мне это почему-то кажется неправильным.
ОБНОВЛЕНИЕ 30.09.2011:
По совпадению я обнаружил, что метод расширения TaskExtensions.Unwrap
, который работает с Task
, дает Task
.
Итак, пока мы не получим C # 5.0, я могу использовать ta.ContinueWith (a => ...). UnWrap () в таких ситуациях, когда само продолжение возвращает задача.