【问题标题】:Async actions in asp.net mvc applicationasp.net mvc 应用程序中的异步操作
【发布时间】:2015-11-16 04:40:23
【问题描述】:

我正在尝试在 ASP.NET MVC 中实现异步操作。代码如下:

[HttpGet]
public async Task<string> HeavyAction(int holdTime)
{
      await Task.Delay(holdTime);
      return "Now I'm done!";
}

此操作显示了主要问题,即当用户使用大参数值 (10000) 调用操作时,应用程序没有响应 - 请求已发送,但浏览器正在等待响应。我认为不应该看起来是一个异步请求。在我看来,用户应该能够同时调用其他操作。

有人可以帮我解决我的问题吗?谢谢! :-)

【问题讨论】:

  • 你是怎么调用这个方法的?按钮还是 JavaScript?
  • 来自查询字符串,因为我正在测试异步等待机制。该动作被调用,但我没有看到异步行为。是否可以在 Web 应用程序中通过 async-await 获得它?
  • @sm4artGuy async 并不意味着该方法将在后台异步运行。这意味着在等待你用'await'关键字做的工作时,它不会占用一个线程,允许线程被另一个请求使用。工作完成后,其余代码将再次占用一个线程来完成请求。所以它不是异步做工作,而是异步等待以更有效地使用系统资源。
  • @serhatozgel 哦,现在我明白了。在这种情况下,最后一个问题。有没有办法异步上传(上传逻辑执行以便用户能够做其他事情,当下载完成时他会收到电子邮件或其他东西)?
  • 我的建议是使用 iframe,然后在该 iframe 中托管您的页面并上传文件。确保您使用只读会话状态,或根本不使用会话状态。这样,您可以并行上传所有文件。您还可以查询服务器以查看文件上传的状态,因为您没有阻止会话。看看 JavaScript 插件 upload-at-click (旧但仍然可以正常工作)。 Https://code.google.com/p/upload-at-click

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


【解决方案1】:

我认为不应该是异步请求。

您对“async-await”的工作原理有误解。当您的方法等待异步方法时,控制权将交还给调用者,在本例中为 ASP.NET 运行时。但是,async-await 不会改变 HTTP 协议的请求-响应性质。因此,只有在 Task.Delay 完成后,下一行代码才会执行​​并向调用者返回响应。

您正在考虑的是一种“即发即弃”的执行方式,您可以在线程池中将委托排队并立即返回控制权。这种性质并不真正适合 ASP.NET,如果您的应用需要任何规模的规模,肯定会损害性能。

【讨论】:

  • 哦,在这种情况下,不可能完成我想要的行为?顺便提一句。真正的问题如下:我正在为小文件(图片、文本等)实现上传服务。对于上传,我已经完成了代码并且它正在工作。但在上传期间,用户必须等到操作完成。有没有办法让它更有弹性?以便用户能够浏览他上传的文件或在服务上做其他事情?当上传完成时,他会收到提示或类似的提示?
  • @sm4rtGuy 我不确定使用 ASP.NET MVC 是否是正确的解决方案。也许查看队列或发布/订阅服务。有很多可用的实现,例如 RabbitMQ 或 Kafka。
【解决方案2】:

当您使用“等待”时,您是在告诉 C# 等待操作完成。尝试在没有“await”关键字的情况下调用您的异步方法。喜欢:

[HttpGet]
public async Task<string> HeavyAction(int holdTime)
{
      Task.Delay(holdTime);
      return "Now I'm done!";
}

所以该方法将立即返回并稍后执行Task.Delay。

【讨论】:

  • Task.Delay 在这里根本没有任何意义。它会简单地启动内部计时器并继续执行到下一行。以后不会执行了。
  • 我认为 op 使用 Task.Delay 作为他/她在应用程序中实际操作的诱饵。
  • 我明白这一点,但是使用任何类型的任务返回方法作为触发和忘记机制通常是不好的,特别是如果正在完成的工作应该返回给调用者或者应该验证完成。尤其是在任意线程池线程无法保证完成的环境中。
  • 是的,你是对的。但这是另一个问题,问题在于系统的设计,这超出了这个问题的范围。
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多