【问题标题】:ASP.Net MVC Long Running ProcessASP.Net MVC 长时间运行过程
【发布时间】:2014-05-23 10:07:02
【问题描述】:

我需要为不同的财务期间生成报告屏幕。由于这是一个包含许多规则的相当大的数据集,因此该过程可能需要很长时间才能运行(有些报告要返回一个多小时)。

在 MVC 中处理这种情况的最佳方法是什么?

我担心:

  • 屏幕锁定
  • 性能
  • 可用性
  • 请求超时

【问题讨论】:

  • 您需要预先准备报告,完成后,将链接呈现给用户,以便他们提取报告。不应根据要求从网站上启动该报告……因为正如您所说,它是一个大型数据集。你需要有一些流程,比如服务,它会生成报告,一旦完成……就可以查看网站将确定的内容
  • 如果可能,改为每晚生成报告,并保存输出。长达一小时的报告是这样做的主要候选人。每晚的工作最好在控制台应用程序中完成,由任务计划程序启动。但这确实取决于什么样的报告。

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

这些确实是有效的担忧。

正如一些评论者已经指出的那样:如果报告不依赖于用户的输入,那么您可能希望事先生成报告,例如每晚生成报告。

另一方面,如果报告确实依赖于用户的输入,您可以通过多种方式规避您的顾虑,但您至少应该将操作拆分为多个步骤:

  1. 让来自浏览器的请求启动生成报告的过程。您可以启动一个新线程并告诉它生成报告,或者您可以将“创建报告”消息放在队列中并让服务使用消息并生成报告。无论您做什么,请确保第一个请求快速完成。它应该返回某种标识刚刚开始的任务的标识符。此时,您可以通知用户系统正在处理请求。
  2. 使用 Ajax 重复轮询服务器以使用给定标识符完成报告。最好,生成报告的进程应该报告它的进度,并且这个信息应该通过 Ajax 轮询提供给用户。如果你想变得花哨,你可以使用 SignalR 来通知浏览器进度。
  3. 报告准备就绪后,将链接返回给用户,让他/她可以访问报告。

根据您的实现方式,用户可以关闭浏览器,喝一口咖啡,然后返回完成的报告。

【讨论】:

    【解决方案2】:

    如果您的应用在带有 IIS 的 Windows Server 上运行,您的 ASP.Net 代码可以在 db 表中创建一条记录,这意味着应该创建该报告。

    然后您可以使用可能在同一台服务器上运行的 Windows 服务或控制台应用程序,并不断检查表中是否有任何新字段。该服务将创建一个报告,并在创建过程中更新表格字段以指示进度。 您的 ASP.net 页面可能正在显示进度条,使用 ajax 请求从 db 获取进度指示,或者只是每隔几秒刷新一次页面。

    如果您在 Windows Azure 云上运行,您可能会使用 WebWorker 而不是 Windows 服务

    对于页面上的屏幕锁定,您可以使用 jquery Block-UI 库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多