【问题标题】:Convert Action<T> callback to an await将 Action<T> 回调转换为等待
【发布时间】:2013-05-30 07:44:16
【问题描述】:

我有一个采用Action&lt;String&gt; 的方法。当该方法完成其处理时,它会使用返回值调用Action&lt;String&gt;

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

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

我想做的就是这个

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback();

【问题讨论】:

  • 我会考虑修改方法本身;以目前的设计,它无法报告错误。

标签: c# action async-await


【解决方案1】:

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

【讨论】:

  • 你的代码有些混乱,因为一般情况下Main()不可能是async。另外,您应该尽可能避免使用async void 方法。
  • Tnx,我编辑了它。该代码是从 linqpad 复制的,其中 Main 必须具有 async 关键字才能在其中使用 await 关键字...
  • 2017 年的问候,现在 Main 可以异步了:P
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多