【问题标题】:ASP.NET MVC 5 How to invoke an async method from the view [duplicate]ASP.NET MVC 5如何从视图调用异步方法[重复]
【发布时间】:2016-03-30 16:08:22
【问题描述】:

我的模型有一个异步方法,我想从视图中调用它,例如:

@Ajax.ActionLink(await Model.GetCaptionAsync(), ...

然而,VS 2015 IDE 抱怨 await 只能在异步方法中使用。

是否有合理的方式从视图中调用异步方法(即不使用 .Result 但保持异步流)?

【问题讨论】:

  • 对于我的项目,我创建了一个常规的后端方法,该方法本身称为异步方法,该方法使用 await 调用异步函数。这对你有用吗?
  • 创建一个动作(并通过 ajax 调用它)并通过它调用所需的异步方法
  • 实际工作应该由 Controller 执行,而不是视图模型。当可以在控制器中完成时,为什么要等到渲染才能检索值?这表明要么 a) 伪装成模型的控制器和/或 b) 包含视图实际上需要的更多属性的模型,因此需要延迟加载

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


【解决方案1】:

【讨论】:

  • 您对调用 .Wait() 的建议不能像在 Windows 窗体或 WPF 应用程序中那样导致死锁吗(因为您在自动调度)?
  • @HenrikDahl 首先不,为什么会这样? Web 应用程序中没有 UI 线程,第二视图模型是 DTO,应该由 控制器的操作 执行异步工作。即使您使用.Result.Wait(),想要实际异步执行操作的模型也存在问题
  • 没有UI线程也没关系。是否存在可能死锁的 SynchronizationContext 很重要。我们不应该跳过这些关于 DTO 和异步工作等琐事的第一课,并且应该在控制器中完成。我的观点需要一些进一步的数据来产生其结果,并且不应将其混入模型中,因为它与模型的概念目的无关。事实上,它是一个特定的 DisplayTemplate,它有需要而不是联合视图。
  • 不要使用这个答案和task.Wait(),它会导致你死锁
猜你喜欢
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2012-04-28
  • 2013-03-02
  • 2022-12-09
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多