ASP.Net MVC长期运行流程

时间:2014-05-23 10:07:03

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

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

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

我很担心:

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

2 个答案:

答案 0 :(得分:7)

这些确实是有效的问题。

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

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

  1. 请求浏览器启动生成报告的过程。您可以启动一个新线程并告诉它生成报告,或者您可以在队列上放置“创建报告”消息并让服务使用消息并生成报告。无论您做什么,请确保第一个请求快速完成。它应该返回某种标识刚刚开始的任务的标识符。此时,您可以通知用户系统正在处理请求。
  2. 使用Ajax重复轮询服务器以使用给定标识符完成报告。优选地,生成报告的过程应该报告其进度,并且应该通过Ajax轮询将该信息提供给用户。如果您想获得幻想,可以使用SignalR通知浏览器进度。
  3. 报告准备就绪后,返回指向他/她可以访问报告的用户的链接。
  4. 根据您的实施方式,用户可以关闭浏览器,喝一口咖啡然后回到完整的报告中。

答案 1 :(得分:0)

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

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

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

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