【问题标题】:Use async with action result使用异步操作结果
【发布时间】:2018-01-04 20:23:09
【问题描述】:

我希望 Residency 返回Task<ActionResult>

public async Task<ActionResult> Residency() 
{
    DBResponse DataSource = await Residency_Manager.Residency_REPORT();
}

下面是 DBResponse 类:

public DBResponse(Int32 statusCode, string message, Object data)
{
    this.StatusCode = statusCode;
    this.Message = message;
    this.Data = data;
}

当我等待 Residency_REPORT 函数时,它返回一个 DBResponse 对象并显示以下错误。

【问题讨论】:

  • 向我们展示Residency_REPORT的签名
  • Residency_Manager.Residency_REPORT 应该返回一个 Task&lt;DBResponse&gt; 并且应该是一个异步方法。此外,您不应该将这么多参数传递给它。为什么这些不是类?
  • 不要发布图片链接。复制并粘贴代码和错误消息本身。 await 不会通过魔法使方法异步,它 等待 已经是异步方法。如果Residency_REPORT 没有返回一个任务,你就不能等待它。这与 ASP.NET MVC 无关
  • 可能你需要Task.Runreturn View() 或类似的东西,return await 可以等待。但是Residency_Manager.Residency_REPORT 在当前状态下可能是不可等待的。
  • @TetsuyaYamamoto 网络请求已经在他们自己的线程上运行。使用 Task.Run 只会将执行转移到新线程,浪费原始线程并且由于线程切换而导致性能下降

标签: c# asp.net-mvc async-await


【解决方案1】:

Residency_Manager.Residency_REPORT() 不是异步方法,所以你不能用await 调用它。

简单的解决方案:不要将Residency 实现为异步方法,因为您不需要异步。如果那里的其他代码异步的,只需删除调用前面的等待:

DBResponse DataSource = Residency_Manager.Residency_REPORT();

另一个简单的解决方案:将 Residency_REPORT 实现为异步并让它返回 Task&lt;DBResponse&gt;

【讨论】:

  • 如果此操作没有调用异步代码,那么您应该将操作的签名也从:public async Task&lt;ActionResult&gt; Residency() 更改为:public ActionResult Residency() 如果Residency_Manager.Residency_REPORT() 返回Task&lt;DBResponse&gt;,则此方法应命名为:Residency_Manager.Residency_REPORTAsync()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多