.net - 为什么 WCF ServiceHost 一旦超出范围仍保持打开状态?

标签 .net multithreading wcf self-hosting servicehost

我刚刚整理了我的一些 WCF(自托管)代码,并意识到我的 ServiceHost 对象在最初设置后超出了范围,但我仍然可以连接到它。

public void StartMyService()
{
    var host = new ServiceHost(typeof(MyService), new Uri("http://localhost:8000/MyService"));
    host.Open();
}

如果我再次调用它并重新实例化它并尝试再次打开它,我会收到一条错误消息,指出已经有东西连接到端点。现在只有当应用程序关闭时它才会被释放。

我只能假设对 Open() 的调用在较低级别执行一些操作,以使其以非托管方式保持打开状态。但是,我找不到任何相关信息,除非我完全误解了这里的内容。

考虑一下,连接现在仍然打开,但我无法在不终止应用程序的情况下返回它(关闭等),这似乎确实不对。或者也许这根本不重要,如果不损害任何东西,我可以一直将其打开?

更新:所以我接受了艾弗的回答,因为它解释了我最初的问题,即为什么它即使在超出范围后仍然保持开放状态。然而,我现在想知道一些关于此的事情(或者可能是我对线程缺乏经验)。首先,我是否担心这个问题,只要它是开放的,那就是最重要的。如果有某种方法可以通过将线程保留在范围内来访问线程,那么它甚至会有所帮助。也许,像这样设置它(并且从不调用 close)使调用代码变得简单(即不必保留引用),我什至可以将其包装在静态方法中以进行更简单的调用。一切听起来都有点躲闪吧……嗯!

更新2:所以,我知道这样做不好,因为这意味着我不再控制主机及其启动的线程。因此,我将其全部包装为单例,这给了我能够在任何点访问主机的好处(对于错误、事件、在同一端点上关闭/重新打开等)并使调用变得非常简单(就像一个简单的静态方法)调用)。

最佳答案

并非所有超出范围的内容都会被终止。如果一个类生成另一个线程(我确信 WCF 会这样做),即使对创建它的类的引用被垃圾收集,该线程也可能存在。

您可能需要调用 host.Close()

关于.net - 为什么 WCF ServiceHost 一旦超出范围仍保持打开状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474453/

相关文章:

.net - 如何正确地散列字符串

.net - "boxing"在 .NET 中如何工作?

multithreading - CUDA统一内存可以被另一个CPU线程写入吗?

visual-studio - Extender Provider 未能为此对象返回 Extender。加载项目时出错

.net - Linq int 到 string

c# - 带虚线的 TreeView/TreeViewItem ControlTemplates

.net - 线程与并行处理

java - @Async 和 @Transactional 的 Spring 启动问题

c# - 强制 WCF 序列化未使用的类

wcf - Servicehost 抛出错误,即使添加到使用 netsh 的配置