【发布时间】:2010-10-06 21:44:41
【问题描述】:
在 ASP.Net 应用程序中,用户单击网页上的按钮,然后通过事件处理程序实例化服务器上的对象并调用对象上的方法。 该方法转到外部系统来做一些事情,这可能需要一段时间。所以,我想做的是在另一个线程中运行该方法调用,这样我就可以通过“您的请求已提交”将控制权返回给用户。 我很高兴能做到即发即弃,但如果用户可以继续轮询对象的状态会更好。
我不知道 IIS 是否允许我的线程继续运行,即使用户会话过期也是如此。 想象一下,用户触发事件,我们在服务器上实例化对象并在新线程中触发方法。用户对“您的请求已提交”消息感到满意并关闭了他的浏览器。最终,此用户会话将在 IIS 上超时,但线程可能仍在运行,正在工作。 IIS 会允许线程继续运行,还是会在用户会话到期后终止线程并处理对象?
编辑:从答案和 cmets 中,我了解到最好的方法是将长期运行的处理移到 IIS 之外。除此之外,这还涉及 appdomain 回收问题。在实践中,我需要在有限的时间内启动版本 1,并且必须在现有框架内工作,所以想避开服务层,因此希望只在 IIS 内启动线程。在实践中,这里的“长时间运行”只会是几分钟,网站上的并发会很低,所以应该没问题。但是,下一个版本肯定需要拆分成一个单独的服务层。
【问题讨论】:
-
您对需要处理的内容和您的托管环境有更多详细信息吗?例如,您是否能够安装服务?
-
您始终可以使用Async and Await 编程方法(Visual Studio 2012+)。比自己管理线程要干净得多。
标签: asp.net multithreading iis background-process