【问题标题】:asynchronous mvc .net: how to return a view from async method异步 mvc .net:如何从异步方法返回视图
【发布时间】:2012-04-28 02:59:24
【问题描述】:

我开始学习 MVC.net 并关注this documentation

在那里,解释了异步控制器将实现两个方法,假设该操作称为 News,然后我们将有一个称为 NewsAsync 的方法,它将返回 void,还有一个 NewsCompleted, 将返回一个视图,一旦未完成的操作返回,就会调用该视图。

我担心的是,我真的看不出异步操作在操作开始后无法返回视图的任何意义。如果在异步回调返回之前,用户将无法从服务中看到任何反馈,那么为什么首先要使用异步控制器呢?

有没有办法在异步操作开始后返回中间视图?我是否不必要地担心这个明显的限制? MVC.net 中我缺少什么吗?

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

异步控制器的重点是促进线程重用,这样如果您有一个特别长时间运行的请求会阻塞资源,您就不会占用请求队列。它与向请求方返回信息无关。最后,他们认为异步控制器和普通控制器之间没有区别。

这并不是让它对 ajax 更友好或其他什么;一个很好的例子是,如果您有一个开始渲染图像的请求;传统上,该请求线程将在 CPU 渲染图像时被消耗。使用异步模式,您仍然可以渲染图像,但是可以释放该线程来服务另一个 Web 请求,直到渲染完成,从而为您的服务器提供更大的吞吐量。

【讨论】:

  • 实际上图像渲染并不是一个很好的例子,让不同的线程渲染图像是没有用的,因为它仍然是 CPU 密集型的。一个更好的例子是发出 I/O 请求,例如联系外部 Web 服务或其他东西。在这种情况下,请求线程被阻塞等待响应,这是一种浪费。它可以在此期间处理其他请求。
  • 当然,这也有效。基本思想是您希望线程不断在请求队列上工作,而不是在另一个资源上被阻塞。
  • 不,两者实际上完全不同。如果一项工作是 CPU 密集型的,那么仅仅将其卸载到另一个线程将一事无成。另一个线程仍然必须完成所有工作。事实上,由于上​​下文切换,您实际上会失去性能。但是对于 I/O 操作,等待网卡完成的线程将被阻塞,并且什么也不做。大浪费。阅读 CPU 限制和 I/O 限制之间的区别。
  • 这个回答有一定道理,实际上证实了我最担心的问题;这听起来像是一个利基优化,它使控制器中的异步与后端性能相关,与表示技术完全无关。我认为 MVC 是一种表示技术,但这个命名决定似乎另有说明
  • @lurscher 我不确定你为什么认为这是一个“利基优化”。 Node.js 实际上是围绕这一想法进行的,一切都是异步的(尽管本身不是为了线程目的)。这很容易做到,任何时候你需要访问外部资源,你也可以这样做,你的应用程序将显着扩展。另外,为什么 MVC 只是一种“展示”技术?这是一个完整的网络堆栈,不是吗? M(模型)与展示有什么关系?
【解决方案2】:

一种策略是在客户端上设置轮询。生成结果后,将通知用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 2014-09-02
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2011-09-06
    相关资源
    最近更新 更多