用于"Fire and Forget"任务的Web Service中的ThreadPool.QueueUserWorkItem

mah*_*esh 6 .net asp.net multithreading web-services threadpool

这是ASP.NET ASMX Web服务/ .NET Framework 4.0.

在Web服务中,我想在另一个线程上执行一个类似"Fire and Forget"的方法,以便Web Service 立即向网站返回一些响应.在Web Service立即向网站返回响应后,另一个线程上的该方法可能需要10分钟.另外,我不需要该方法的返回值.

我已经使用ThreadPool.QueueUserWorkItem测试了这个场景,似乎即使在Web Service将响应返回给Web站点之后,使用ThreadPool启动的线程仍将继续执行.我在这里纠正吗?还有更好的方法来实现这一目标吗?

Nic*_*ler 6

问题是,ASP.NET会不时地回收应用程序池.因为它不知道您的后台任务,所以它将不会被考虑,并且在处理AppDomain时将被中止.

大部分时间,工作都会完成,但如果运行的时间足够长,您将遇到这种情况.

有两种解决方案:

1)"正确"的方法是编写一个在ASP.NET外部运行的Windows服务.您可以通过WCF向服务发送指令.

2)"快速而肮脏"的方法是在ASP.NET站点中编写一个永远不会被用户调用的隐藏Web服务.您的应用程序启动对隐藏服务的异步请求,然后将其自己的结果返回给用户,而无需等待.

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