【问题标题】:ThreadPool.QueueUserWorkItem in Web Service for “Fire and Forget” taskWeb 服务中的 ThreadPool.QueueUserWorkItem 用于“一劳永逸”任务
【发布时间】:2012-05-05 05:32:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net .net multithreading web-services threadpool


    【解决方案1】:

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

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

    有两种解决方案:

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

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

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

    【讨论】:

    • 嗨 Nicholas,asp.net 中隐藏的 Web 服务如何确保应用程序池不会被回收?
    • 我对“又快又脏”感兴趣——我是否应该创建一个由用户启动的 web 服务方法调用的新异步函数?
    猜你喜欢
    • 2016-07-20
    • 2017-06-16
    • 1970-01-01
    • 2016-11-11
    • 2011-09-16
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多