Есть ли у getB
метод, который возвращает Task<B>
вместо B
?
Проблема в том, что ContinueWith
это:
public Task<TNewResult> ContinueWith<TNewResult>(
Func<Task<TResult>, TNewResult> continuationFunction,
CancellationToken cancellationToken
)
Итак, в вашем случае, поскольку getB
возвращает Task<B>
, вы передаете Func<Task<A>, Task<B>>
, поэтому TNewResult
равно Task<B>
.
Если вы можете изменить getB
так, чтобы он просто возвращал B
с учетом A
, это сработало бы ... или вы можете использовать:
return ta.ContinueWith(a => getB(a.Result).Result);
Тогда лямбда-выражение будет иметь тип Func<Task<A>, B>
, поэтому ContinueWith
вернет Task<B>
.
РЕДАКТИРОВАТЬ: В C # 5 вы можете легко написать:
public async Task<B> CombinedAsync()
{
A a = await getA();
B b = await getB(a);
return b;
}
... так что "просто" нужно решить, чем это закончится. Я подозреваю это что-то вроде этого, но с обработкой ошибок:
public Task<B> CombinedAsync()
{
TaskCompletionSource<B> source = new TaskCompletionSource();
getA().ContinueWith(taskA => {
A a = taskA.Result;
Task<B> taskB = getB(a);
taskB.ContinueWith(t => source.SetResult(t.Result));
});
return source.Task;
}
Имеет ли это смысл?