将Action <t>回调转换为等待</t>

时间:2013-05-30 07:44:16

标签: c# action async-await

我有一个方法需要Action<String>。当方法完成其处理时,它会使用返回值调用Action<String>

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

我想在web.api异步控制器中使用它。如何包装此方法,以便我awaitasync的方式完成此方法。我无法修改方法本身,它在遗留代码库中。

我希望能够做到的是

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback();

1 个答案:

答案 0 :(得分:11)

您可以利用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);