C# 转换操作<;T>;回电等待

C# 转换操作<;T>;回电等待,c#,action,async-await,C#,Action,Async Await,我有一个采取操作的方法。当该方法完成其处理时,它使用返回值调用操作 MethodWithCallback((finalResponse)=> { Console.WriteLine(finalResponse); }); 我想在web.api异步控制器中使用它。如何包装此方法,以便可以等待以异步方式完成此方法。我无法修改该方法本身,它位于遗留代码库中 我希望能够做到的是 String returnValue = await MyWrapperMethodThatCallsMetho

我有一个采取
操作的方法
。当该方法完成其处理时,它使用返回值调用
操作

MethodWithCallback((finalResponse)=> {
   Console.WriteLine(finalResponse);
});
我想在web.api异步控制器中使用它。如何包装此方法,以便可以
等待
异步方式完成此方法。我无法修改该方法本身,它位于遗留代码库中

我希望能够做到的是

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback();
您可以利用该类并以通用方式解决问题:

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;
}

您的代码有些混乱,因为在正常情况下,
Main()
不能是
async
。另外,您应该尽可能避免使用
async void
方法。代码从LIQPAD中复制,其中main必须具有异步关键字,以便在其中使用AWE关键字……问候语2017,main现在可以异步:PI将考虑修改方法本身;按照目前的设计,它无法报告错误。
var result = await AsAsync<string>(MethodWithCallback);
Console.WriteLine(result);