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

时间:2012-04-24 14:44:10

标签: asp.net .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启动的线程仍将继续执行。我在这里纠正吗?还有更好的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:6)

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

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

有两种解决方案:

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

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

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