如何在MVC中请求后执行工作

时间:2014-09-20 19:51:37

标签: asp.net-mvc asynchronous

我有一个长时间运行的CPU绑定任务,我想从我的MVC应用程序中的链接初始化。当我单击该链接时,我希望服务器创建一个GUID来标识作业,将该GUID返回给客户端,并在返回后执行该作业。

我使用ThreadPool.QueueWorkItem进行设置,但在MVC中使用I've read this can be problematic进行设置。这种情况有更好的选择吗?我应该使用不同的方法吗?

2 个答案:

答案 0 :(得分:0)

根据我的经验,最好不要在ASP.NET应用程序本身而是在单独的应用程序中执行长时间运行的CPU任务。例如,您可以创建单独的Windows service来处理任务。要交换数据,您可以使用例如消息队列,数据库(可能是最简单的方法)或Web服务。

这种方法具有以下优点:

1)后台工作的完整性。在IIS中,您可以配置为定期重新启动工作进程。如果您的后台作业正在运行,那么它将被中断,这可能是不可取的。

2)规划服务器负载平衡。例如,您可以将Web服务移动到单独的服务器,该服务器将释放Web服务器并可提供更好的最终用户体验。

看看这个example,了解如何使用Azure实现它。

答案 1 :(得分:0)

您可以通过创建异步任务而不等待它来解决问题,并且它会在大多数时间成功运行,但由于IIS应用程序生命周期管理,这些任务可能会突然切断。

您可以在IIS中注册IRegisteredObject对象,因此IIS将会知道该域正在关闭。

请看一下这篇文章: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/