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 会被 GC 吗?我认为堆栈中存储了一个引用对象的引用,只有当方法退出时,堆栈才会被清除,因此引用被清除,只有对象应该被 GCed。

4

2 回答 2

2

这取决于。如果socket维护对创建它的上下文的引用,则没有。(*)

如果没有,那么也许。如果您在非调试上下文中运行,那么它可能会在循环运行时被收集while- 当然,如果在循环的生命周期内没有发生任何收集,while那么它将不会被收集。

如果您在调试中运行,那么所有局部变量都会保持活动状态,直到方法结束。


(*) 同样,ZmqContext.Create似乎是一个静态方法。如果该方法将它返回的值存储在某种静态集合中,那么它可能仍然不符合条件。

于 2013-01-07T10:37:58.200 回答
1

这取决于是否socket持有对它的引用。

如果socket确实持有对它的引用,ctx那么它将不会被 GC 处理。

如果socket没有引用,ctx那么它可以用于 GC。

如果您不希望它被 GC 处理,那么GC.KeepAlive在循环之后添加一个调用。

于 2013-01-07T10:36:39.100 回答