如果有任务正在尝试访问不可用的 WCF 服务,则不会调用 windows 服务上的 OnStop 方法

OnStop method on windows service not being called if there are tasks that are attempting to access unavailable WCF service

今天我 运行 在 Windows 服务方面遇到了一点问题。

服务本身已经运行良好一年多了,它的主要工作是为 TCP 客户端提供数据流。

不久前,我添加了对 WCF 服务的调用以发送有关数据流的一些信息。

为了防止这些 WCF 调用严重影响现有逻辑,我使用了

Task.Run(() => {
    using(var proxy = new WCFProxy("configurationName"))
    {
         proxy.WCFClientMethod()
    }
});

这很好用,但我注意到如果我在远程 WCF 服务不可用时尝试通过 services.msc 停止它,windows 服务会卡在停止状态。

如果远程 WCF 服务可用或在 windows 服务卡在停止状态期间变得可用,则停止服务成功。

经过一些调试我发现 OnStop 方法没有被调用。

我在 Internet 上找到了几篇关于在 ThreadPool 中的所有任务完成之前不调用 OnStop 方法的文章。但我不确定这是否与此问题有关,主要是因为 ThreadPool 中的 AFAIK 任务无论如何都应该完成,无论它们是否 faulted(EndpointNotFoundException)

我将不胜感激有关如何解决此问题的任何想法(使用 Thread 而不是 Task.Run 不是一个好的选择,因为对 WCF 服务的调用很多并且创建这么多线程可能会导致性能问题).

刚刚解决了我的问题。

发现 WCF 调用阻塞了 ThreadPool 中的实际任务 这导致对 OnStop 方法的调用被卡在队列中。

我已经使 WCF 调用与 async/await 异步,现在一切运行顺利。