我有一个长时间运行的CPU绑定任务,我想从我的MVC应用程序中的链接初始化。当我单击该链接时,我希望服务器创建一个GUID来标识作业,将该GUID返回给客户端,并在返回后执行该作业。
我使用ThreadPool.QueueWorkItem
进行设置,但在MVC中使用I've read this can be problematic进行设置。这种情况有更好的选择吗?我应该使用不同的方法吗?
答案 0 :(得分:0)
根据我的经验,最好不要在ASP.NET应用程序本身而是在单独的应用程序中执行长时间运行的CPU任务。例如,您可以创建单独的Windows service来处理任务。要交换数据,您可以使用例如消息队列,数据库(可能是最简单的方法)或Web服务。
这种方法具有以下优点:
1)后台工作的完整性。在IIS中,您可以配置为定期重新启动工作进程。如果您的后台作业正在运行,那么它将被中断,这可能是不可取的。
2)规划服务器负载平衡。例如,您可以将Web服务移动到单独的服务器,该服务器将释放Web服务器并可提供更好的最终用户体验。
看看这个example,了解如何使用Azure实现它。
答案 1 :(得分:0)
您可以通过创建异步任务而不等待它来解决问题,并且它会在大多数时间成功运行,但由于IIS应用程序生命周期管理,这些任务可能会突然切断。
您可以在IIS中注册IRegisteredObject对象,因此IIS将会知道该域正在关闭。