首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以使用线程在IIS上执行长时间运行的作业?

是否可以使用线程在IIS上执行长时间运行的作业?
EN

Stack Overflow用户
提问于 2009-02-11 13:09:59
回答 8查看 52.4K关注 0票数 87

在ASP.Net应用程序中,用户单击网页上的一个按钮,然后通过事件处理程序在服务器上实例化一个对象,并对该对象调用一个方法。该方法转到外部系统去做一些事情,这可能需要一段时间。所以,我想要做的是在另一个线程中运行该方法调用,这样我就可以将控制权返回给用户,并显示“您的请求已提交”。我很乐意这样做,尽管如果用户可以不断轮询对象的状态,那就更好了。

我不知道的是,IIS是否允许我的线程继续运行,即使用户会话过期。想象一下,用户触发事件,我们在服务器上实例化对象,并在新线程中触发方法。用户对“您的请求已提交”消息感到满意,并关闭浏览器。最终,此用户会话将在IIS上超时,但线程可能仍在运行,正在进行工作。IIS是允许线程继续运行,还是在用户会话到期后终止该线程并释放该对象?

编辑:从答案和评论中,我了解到最好的方法是将长期运行的处理移到IIS之外。抛开其他所有事情不谈,这处理的是appdomain回收问题。在实践中,我需要在有限的时间内推出版本1,并且必须在现有框架内工作,因此我希望避免服务层,因此希望只在IIS内触发线程。在实践中,这里的“长时间运行”只有几分钟,网站上的并发性会很低,所以应该没问题。但是,下一个版本肯定需要拆分成一个单独的服务层。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-02-11 21:53:01

你可以完成你想要的,但这通常是一个糟糕的想法。一些ASP.NET博客和内容管理系统引擎采用这种方法,因为它们希望可以安装在共享主机系统上,而不是依赖于需要安装的windows服务。通常,当应用程序启动时,它们会在Global.asax中启动一个长时间运行的线程,并让该线程对任务进行排队。

除了减少IISASP.Net处理请求的可用资源之外,您还会遇到在回收AppDomain时线程被终止的问题,然后您必须处理任务在运行过程中的持久性问题,以及在AppDomain重新启动时启动备份工作的问题。

请记住,在许多情况下,如果您更新web.config,则会以默认时间间隔自动回收AppDomain。

如果您可以处理线程在任何时候被终止的持久性和事务性方面,那么您可以通过让某个外部进程在某个时间间隔在您的站点上发出请求来绕过AppDomain回收-这样,如果站点被回收,您可以保证它在X分钟内自动重新启动。

再说一次,这通常是一个糟糕的想法。

编辑:以下是该技术的一些实际应用示例:

Community Server: Using Windows Services vs. Background Thread to Run Code at Scheduled Intervals Creating a Background Thread When Website First Starts

编辑(来自遥远的未来)-这些天我会使用Hangfire

票数 65
EN

Stack Overflow用户

发布于 2009-02-11 16:58:17

您不希望将IIS线程池中的线程用于此任务,因为这会使该线程无法处理将来的请求。你可以研究一下Asynchronous Pages in ASP.NET 2.0,但这也不是正确的答案。相反,听起来你会从中受益的是研究Microsoft Message Queuing。实际上,您需要将任务详细信息添加到队列中,另一个后台进程(可能是Windows服务)将负责执行该任务。但底线是后台进程与IIS完全隔离。

票数 7
EN

Stack Overflow用户

发布于 2016-02-04 20:40:16

我建议使用HangFire来满足这些需求。它是一个在后台运行的好引擎,支持不同的架构,可靠,因为它有持久化存储支持。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/536681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档