5

を取るメソッドがありAction<String>ます。メソッドが処理を終了するAction<String>と、戻り値で を呼び出します。

MethodWithCallback((finalResponse)=> {
   Console.WriteLine(finalResponse);
});

これを web.api 非同期コントローラーで使用したいと考えています。awaitこのメソッドをラップして、このメソッドをある方法で完了するにはどうすればよいですかasync。メソッド自体を変更することはできません。それはレガシー コード ベースにあります。

私ができるようになりたいのはこれです

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback();
4

1 に答える 1

12

TaskCompletionSourceクラスを利用して、一般的な方法で問題を解決できます。

Task<T> AsAsync<T>(Action<Action<T>> target) {
    var tcs = new TaskCompletionSource<T>();
    try {
        target(t => tcs.SetResult(t));
    } catch (Exception ex) {
        tcs.SetException(ex);
    }
    return tcs.Task;
}

そうすれば、あなたのを変更する必要はありませんMethodWhitCallback:

var result = await AsAsync<string>(MethodWithCallback);
Console.WriteLine(result);
于 2013-05-30T07:57:27.793 に答える