【问题标题】:OnStop method on windows service not being called if there are tasks that are attempting to access unavailable WCF service如果有任务试图访问不可用的 WCF 服务,则不会调用 Windows 服务上的 OnStop 方法
【发布时间】:2017-02-05 09:11:23
【问题描述】:

今天我在使用 Windows 服务时遇到了一点问题。

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

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

为了防止这些 WCF 调用严重影响已经存在的逻辑,我使用了

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net wcf windows-services threadpool


    【解决方案1】:

    刚刚解决了我的问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多