如何在后台ASP MVC中运行方法

时间:2011-05-01 16:41:22

标签: asp.net-mvc asynchronous background-process

我需要从控制器执行一个特别长的运行方法。方法在它自己的模型中。我正在使用异步控制器,并且我使用asyncFunc库进行方法设置以使其异步。我也试过在它自己的进程上调用它。问题是我希望控制器继续并返回一个视图,以便用户可以继续做其他事情,因为该方法将通知用户它已完成或通过电子邮件有任何错误。

问题甚至是这是一种异步方法,控制器在进程完成之前不会继续前进以返回视图。 15分钟以上如果您导航到另一个页面,该方法将停止尝试执行。

那么如何让方法作为工人执行并释放控制器呢?

任何帮助将不胜感激。

一切顺利,

Chase Q,Aucoin

3 个答案:

答案 0 :(得分:0)

在ASPX页面中使用ThreadPool.QueueUserWorkItem()作为“即发即弃”的方法。

将WaitCallback中长时间运行的工作传递给QUWI。 当工作完成后,WaitCallback可以发送电子邮件或其他任何想要的电子邮件。

您需要注意处理在15分钟运行期间停止w3wp.exe的情况。如果工作完成2/3,你会怎么做?一些选项是,使工作可以重新启动,或者只是允许忘记中断的工作。

使其可重新启动可能意味着,当w3wp.exe重新启动时,您的ASP.NET逻辑确保重新开始,任何被中断的工作。这可能意味着您的ASP.NET逻辑设置了“同步点”,以便它知道重新启动的位置。

如果您需要可重新启动的选项,您可能会考虑Workflow,它是专门为此目的而设计的 - 维护长时间运行的工作流的状态,自动重新启动等等。如果使用Workflow,则可以将其设置为异步运行,并且您可能认为不需要QueueUserWorkItem。

另见:
Moving a time taking process away from my asp.net application
the Workflow Foundation tag

答案 1 :(得分:0)

这将有助于> http://msdn.microsoft.com/en-us/library/ms227433.aspx

这是在.NET堆栈中在服务器上运行后台进程的标准方法。

答案 2 :(得分:0)

我不知道为什么,但我仍然坚信不应该这样做。在ASP.NET中执行后台线程。您还将从IIS控制的ASP.NET线程池中窃取线程。它可以决定你的工作进程出了什么问题,并且只是为了保持内存消耗,处理时间消耗或线程消耗低来重新启动它。如果你需要后台逻辑创建自定义NT服务并通过旧的.NET远程处理或WCF调用该服务上的进程。

顺便说一下。我所描述的方法经常用于商业应用程序,而那些不使用它的方法通常会自托管整个Web服务器。