这是 ASP.NET ASMX Web 服务/.NET Framework 4.0。
在 Web 服务中,我想在另一个线程上执行一个方法,例如“Fire and Forget”,以便 Web 服务返回一些价值立即响应网站。 Web 服务立即将响应返回到网站后,另一个线程上的该方法可能需要 10 分钟。另外,我不需要该方法的返回值。
我已经使用 ThreadPool.QueueUserWorkItem 测试了此场景,似乎使用 ThreadPool 启动的线程即使在 Web 服务将响应返回到网站后仍将继续执行。我在这里说得对吗?还有更好的方法来实现这一目标吗?
问题是,ASP.NET 会时不时地回收应用程序池。因为它不知道您的后台任务,所以当 AppDomain 被处置时,它不会被考虑并被中止。
大多数时候,工作都会完成,但如果运行足够长的时间,就会遇到这种情况。
有两种解决方案:
1) “正确”的方法是编写一个在 ASP.NET 外部运行的 Windows 服务。您可以通过 WCF 向服务发送指令。
2) “快速而肮脏”的方法是在 ASP.NET 站点中编写一个永远不会被用户调用的隐藏 Web 服务。您的应用程序启动对隐藏服务的异步请求,然后将其自己的结果返回给用户,无需等待。
ASP.NET 不知道对隐藏服务的请求来自您的应用程序内部 - 它只是将其视为另一个请求。因为 ASP.NET 知道这个请求,所以它在回收时不会中止它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)