4

TPL を使用Task<TResult>して、次の署名でスレッドセーフなメソッドを非同期的に呼び出し、ブール値の戻り値と出力パラメーターを取得することはできますか?

public bool TryGet(T1 criteria,
                   out T2 output)

明らかに、出力パラメーターのためにラムダ式を使用できません。さらに、コンストラクターがサポートしていない厳密に型指定されたパラメーターとして基準を渡す必要があるため、以下のようなカスタム デリゲートを定義してTask<TResult>コンストラクターに渡すことによって問題を解決することはできません。

public delegate TResult Func<T1, T2, TResult>(T1 arg1,
                                              out T2 arg2);

以下のようなラッパーを作成し、代わりに非同期で呼び出すための最良のオプションはありますか?

public Tuple<bool, T2> TryGetWrapper(T1 criteria)
{
    T2 output;

    bool result = obj.TryGet(criteria,
                             out output);

    return new Tuple<bool, T2>(result,
                               output);
}

少しエレガントに見えず、少し気まぐれです。

4

2 に答える 2

1

あなたのアプローチは、あなたができる最善のことだと思います。これを頻繁に行う場合は、outパラメーターを持つデリゲートをTuple-returning デリゲート (またはTryResultMatthew Watson の回答のように -returning のようなもの)に変換するヘルパー メソッドを使用できます。

public delegate TResult OutFunc<TIn, TOut, TResult>(TIn input, out TOut output);

public static Func<TIn, Tuple<TResult, TOut>> OutToTuple<TIn, TOut, TResult>(
    OutFunc<TIn, TOut, TResult> outFunc)
{
    return input =>
    {
        TOut output;
        TResult result = outFunc(input, out output);
        return Tuple.Create(result, output);
    };
}
于 2013-04-29T13:27:28.057 に答える