c# - 将 Action<T> 回调转换为等待

标签 c# action async-await

我有一个采用 Action<String> 的方法.当该方法完成其处理时,它调用 Action<String>与返回值。

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

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

我想做的就是这个

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback();

最佳答案

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

关于c# - 将 Action<T> 回调转换为等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16830601/

相关文章:

c# - WP8后台代理网络请求

javascript - NGXS:将操作分离到单独的文件中

c# - 寻找指导以了解如何使用Async和Await进行异步编程

postgresql - 为什么在 F# 中使用 `TransactionScope` 时 NpgsqlConnection 没有正确关闭或打开?

c# - MVC Post 导致 QueryString 在重新加载同一 View 时丢失

c# - 转换字典以供 javascript 使用

c# - 为什么在没有返回值的 lambda 中添加 throw 会被推断为 Func<T> 而不是 Action?

java - 如何向 JTable (Java) 添加一种类型的监听器?

c# - 如何在ASP.NET中并行化CPU密集型操作

c# - 如何在 Orchard cms 中添加网站元数据