1
 public static void TimePublisher(int port)
    {
        var ctx = ZmqContext.Create();
        var socket = ctx.CreateSocket(SocketType.REP);
        socket.Bind("tcp://*:" + port.ToString(CultureInfo.InvariantCulture));
        while (true)
        {
            try
            {
                var wait = socket.Receive(Encoding.UTF8);
                var timeString = GetTimeString();
                socket.Send(timeString, Encoding.UTF8);
            }
            catch (ZmqException ex)
            {
                Logger.ErrorException("blabla", ex);
            }

        }
    }

以下の while ループの実行中に、オブジェクト ctx は GCed になりますか? オブジェクトを参照する参照がスタックに格納されていると思います。メソッドが終了したときにのみ、スタックがクリアされ、参照がクリアされ、その場合にのみオブジェクトをGCする必要があります。

4

2 に答える 2

2

場合によります。それを作成したコンテキストへの参照を維持する場合socketは、いいえ(*)

そうでなければ、多分。デバッグ以外のコンテキストで実行している場合は、ループの実行中に収集される可能性whileがあります。もちろん、ループの存続期間中に収集が発生しない場合は、while収集されません。

デバッグで実行している場合、すべてのローカル変数はメソッドの最後まで維持されます。


(*) 同様にZmqContext.Create、静的メソッドのようです。そのメソッドが返す値を何らかの静的コレクションに格納する場合、おそらくまだ適格ではありません。

于 2013-01-07T10:37:58.200 に答える
1

それsocketへの参照を保持しているかどうかによって異なります。

socketへの参照を保持している場合は、GC されctxません。

socketへの参照を保持していない場合はctx、GC で使用できるようになります。

GC したくない場合はGC.KeepAlive、ループの後に呼び出しを追加します。

于 2013-01-07T10:36:39.100 に答える