转换Action< T>对await的回调

本文关键字:await 回调 Action 转换 | 更新日期: 2023-09-27 18:15:56

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

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

我想在web中使用这个。API异步控制器。我如何包装这个方法,以便我可以await为这个方法在async方式完成。我不能修改方法本身,它在遗留代码库中。

我希望能够做到的是

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback();

转换Action< T>对await的回调

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