gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:00:44 25 4
gpt4 key购买 nike

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

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

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

我只能假设对 Open() 的调用在较低级别上做了一些事情,以使其以现在不受管理的方式保持打开状态。但是,除非我在这里完全误解了事情,否则我找不到任何有关此的信息。

考虑一下,连接现在仍然打开,但我无法在不杀死应用程序的情况下恢复它(关闭等),这似乎并不正确。或者也许这甚至无关紧要,如果它不伤害任何东西,我可以一直让它打开?

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

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

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com