问问题
690 次
2 回答
8
您可以使用TaskExtensions.Unwrap将整个链编写为:
Task<string> DoBoth(int value)
{
Task<Task<string>> task = DoInt(value).ContinueWith(valueTask =>
{
return DoString(valueTask.Result);
});
return task.Unwrap();
}
请注意,这假定DoInt
定义为Task<int> DoInt(int value);
,这与您的描述不同,但遵循您的代码示例。
如果 DoInt 不采用 int 参数(与您的声明匹配),则可能变为:
Task<string> DoBoth()
{
return DoInt().ContinueWith(t => DoString(t.Result)).Unwrap();
}
作为额外的 - 使用 C# 5 和 .NET 4.5(或异步目标包),您可以将其编写为:
async Task<string> DoBoth(int value)
{
int first = await DoInt(value);
return await DoString(first);
}
于 2012-08-14T15:43:06.153 回答
0
您需要函数式语言中的 flatMap 方法之类的东西。http://en.wikipedia.org/wiki/Monad_%28functional_programming%29#fmap_and_join
于 2014-03-02T10:39:48.127 回答