如果有任务正在尝试访问不可用的 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
异步,现在一切运行顺利。
今天我 运行 在 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
异步,现在一切运行顺利。