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