6

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

在 Web 服务中,我想在另一个线程上执行一个方法,例如“一劳永逸”,以便 Web 服务返回一些值以立即响应网站。Web Service 立即向网站返回响应后,另一个线程上的该方法可能需要 10 分钟。另外,我不需要该方法的返回值。

我已经使用 ThreadPool.QueueUserWorkItem 测试了这个场景,似乎使用 ThreadPool 启动的线程仍然会继续执行,即使 Web 服务将响应返回到网站。我在这里正确吗?还有更好的方法来实现这一目标吗?

4

1 回答 1

6

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

大多数时候,工作会完成,但如果你运行的时间足够长,就会遇到这种情况。

有两种解决方案:

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

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

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

于 2012-04-24T14:48:10.957 回答