11
4

2 回答 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 回答