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 Listenerオブジェクトを作成し、それをリモートデーモンにサブスクライブしてから、作成した次のTibcoListenerオブジェクトに参照を移動します。

ガベージコレクターは、_listenerが参照するため、最後のオブジェクトを除くすべてのリスナーオブジェクトを収集することを期待しています。ただし、実行結果は、すべてのリスナーオブジェクトが機能していることを示しています。

なぜ?GCがリスナーオブジェクトを収集する時間がないほどアプリケーションを十分に長く実行していないという理由だけでしょうか、それとも「孤立しているはずの」リスナーオブジェクトを参照している固有のものがあるのでしょうか。

教えてください!ありがとう。

4

1 に答える 1

2

一般に、ガベージ コレクターがいつ実行されるかはわかりません。そのため、他のデータがない場合、最も可能性の高い説明は、GC がまだリスナーを収集していないという最初の推測です。

私の RV ドキュメント (リリース 7.2 以降) には、次のように記載されています。

リスナー オブジェクトは、プログラムによって破棄されるまでメッセージをリッスンし続けます。メソッド Listener.Destroy はリスナーを明示的に破棄し、メッセージへの関心を即座に取り消します。リスナーへのすべての参照を削除することにより、リスナーを暗黙的に破棄することもできますが、ガベージ コレクターは、オブジェクトを破棄してインタレストをキャンセルする前に遅延を導入する可能性があります。

(私のハイライト)。したがって、それはあなたの推測を確認します。

于 2013-01-09T14:53:09.160 に答える