我需要从控制器执行一个特别长的运行方法。方法在它自己的模型中。我正在使用异步控制器,并且我使用asyncFunc库进行方法设置以使其异步。我也试过在它自己的进程上调用它。问题是我希望控制器继续并返回一个视图,以便用户可以继续做其他事情,因为该方法将通知用户它已完成或通过电子邮件有任何错误。
问题甚至是这是一种异步方法,控制器在进程完成之前不会继续前进以返回视图。 15分钟以上如果您导航到另一个页面,该方法将停止尝试执行。
那么如何让方法作为工人执行并释放控制器呢?
任何帮助将不胜感激。
一切顺利,
Chase Q,Aucoin
答案 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服务器。