У меня есть два асинхронных метода Task<int> DoInt()
и Task<string> DoString(int value)
. У меня есть третий асинхронный метод Task<string> DoBoth(int value)
, целью которого является асинхронное выполнение DoInt()
, выводящий его на DoString(int)
, и результат будет результатом DoBoth()
.
Важными ограничениями являются:
- Возможно, у меня нет исходного кода для
DoInt()
илиDoString()
, поэтому я не могу измените их. - Я не хочу блокировать в любой момент
- Результат (результат) одной задачи должен быть передан в качестве входных данных для следующего
- Конечный результат (результат) - это то, что я хочу быть результатом
DoBoth()
Ключом у меня уже есть методы, которые являются асинхронными (т.е. return Task), и я хочу передать данные из задачи в задачу без блокировки по пути, возвращая конечный результат в исходную задачу. Я могу сделать все следующее, кроме как блокирование в следующем коде:
Пример кода:
// Two asynchronous methods from another library, i.e. can't be changed
Task<int> DoInt();
Task<string> DoString(int value);
Task<string> DoBoth()
{
return DoInt().ContinueWith<string>(intTask =>
{
// Don't want to block here on DoString().Result
return DoString(intTask.Result).Result;
});
}
Так как Task<string> DoString(int)
уже является асинхронным методом, как я могу создать для него неблокирующее продолжение? Фактически я хочу создать продолжение из существующей задачи, а не из Func.