在 Web 服务中使用 ThreadPool.QueueUserWorkItem 实现“Fire and Forget”任务

6
这是ASP.NET ASMX Web Service / .NET Framework 4.0。
在Web服务中,我想要执行另一个线程上的一个方法,类似于“Fire and Forget”,以便Web服务立即向网站返回一些值。那个另一个线程上的方法可能需要10分钟才能完成,但Web服务会立即将响应返回给网站。此外,我不需要该方法的返回值。
我已经使用ThreadPool.QueueUserWorkItem测试了这种情况,似乎使用ThreadPool启动的线程仍将继续执行,即使Web服务已经将响应返回给网站。我在这里正确吗?还有更好的方法来实现这一点吗?
1个回答

6
问题在于ASP.NET会定期回收应用程序池。因为它不知道你的后台任务,所以当AppDomain被处理时,它将被终止。

大多数情况下,工作会完成,但如果运行时间太长,就会遇到这种情况。

有两种解决方案:

1)“正确”的方式是编写一个运行在ASP.NET之外的Windows服务。您可以通过WCF向该服务发送指令。

2)“快速”而“粗暴”的方式是在ASP.NET站点中编写一个隐藏的Web服务,用户永远不会调用它。您的应用程序开始向隐藏服务发出异步请求,然后返回自己的结果给用户,而无需等待。

ASP.NET不知道对隐藏服务的请求来自于您的应用程序 - 它只把它视为另一个请求。因为ASP.NET知道这个请求,所以它在回收时不会中止它。


嗨,尼古拉斯,ASP.NET 内部的隐藏 Web 服务是如何确保应用程序池不会被回收的? - Abhijeet
我对“快速而简单”的方法很感兴趣 - 我是否应该创建一个新的异步函数,由用户启动的 Web 服务方法来调用它? - Liron Harel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接