2

我有一个奇怪的问题,让我们从一段代码开始:

foreach (var para in paras)
{
    var specificSubject = string.Format(subject, paras);
    _listener = new Listener(Queue.Default, transport, specificSubject, new object());
    _listener.MessageReceived += OnMessage;
}

如您所见,我创建了一个 Tibco 侦听器对象,将其订阅到某个远程守护程序,然后将引用移动到我创建的下一个 Tibco 侦听器对象。

我希望垃圾收集器收集除最后一个之外的所有侦听器对象,因为 _listener 引用它。但是,运行结果表明所有侦听器对象都在工作。

所以为什么?仅仅是因为我没有运行我的应用程序足够长的时间,以至于 GC 没有时间收集侦听器对象,还是有一些固有的东西在引用“应该孤立”的侦听器对象?

请赐教!谢谢。

4

1 回答 1

2

通常,您永远无法确定垃圾收集器何时运行,因此在没有任何其他数据的情况下,最可能的解释是您的第一个猜测,即 GC 尚未收集侦听器。

我的 RV 文档(来自 7.2 版)指出

侦听器对象继续侦听消息,直到程序将其销毁。Listener.Destroy 方法显式地销毁侦听器,立即取消对消息的兴趣。您也可以通过删除对它的所有引用来隐式销毁侦听器,但垃圾收集器可能会在销毁对象并取消兴趣之前引入延迟。

(突出我的)。所以它证实了你的猜测。

于 2013-01-09T14:53:09.160 回答