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 に答える