如何处理ASP.NET MVC站点上的长时间运行的进程?

时间:2013-12-20 17:13:43

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

此程序用于将已导入的数据逐行导入规范化表格。有时可能需要数小时。

它是如何工作的

  1. 使用按下按钮开始处理
  2. 从jquery调用MVC控制器上的方法。
  3. 该控制器调用DLL然后开始长处理
  4. 一次只有一个人使用此程序。

    我们担心它会占用ASP.NET IIS线程。如果不是运行代码的网站,我们可以制定一个每隔30分钟运行一次EXE的计划任务来检查和处理代码,这会更有效吗。

    编辑1:在与同事交谈之后,我们现在要做的工作就是从网站上删除按钮,然后将处理重构为每5分钟运行一次的计划任务......如果有的话关于这一点的任何评论让我知道。

    问题实际上是关于网站运行代码与完全独立的EXE之间的差异... IIS线程与进程...它有帮助吗?

2 个答案:

答案 0 :(得分:2)

如果处理需要数小时,它肯定应该在一个单独的进程中,而不仅仅是一个单独的线程。通过将其放入单独的进程中,您可以使线程锁定和管理,垃圾收集和其他事情变得复杂。例如,如果需要重新启动Web服务器,则可以继续运行单独的进程而不会受到影响。通过一些工作,如果需要,您甚至可以在单独的服务器上启动此过程(当然,您需要更改流程启动机制来执行此操作)

答案 1 :(得分:1)

当任务可以运行几个小时阻止ASP.Net线程绝对是错误的做法。网络呼叫应在合理的时间内完成(理想情况下为几秒钟,最差时间为几分钟)。花费相当长的任务可以从Web请求启动,但绝对不应该阻止整个执行。

我认为有一些可能的前进道路

  1. 如果这是一项需要半定期执行的任务,请将其计入EXE,并安排任务以正确的时间间隔运行
  2. 如果此任务应按需运行,则将其分解为EXE并让Web请求启动EXE但不等待其完成
  3. 另一种可能性是将其分解为长时间运行的服务器进程。然后使用远程处理或WCF在asp.net和进程之间进行通信