在循环被GC时会反对外面吗?

时间:2013-01-07 10:35:30

标签: c# garbage-collection while-loop

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

2 个答案:

答案 0 :(得分:1)

取决于socket是否包含对它的引用。

如果socket确实包含对ctx的引用,那么它将不会是GC。

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

如果您不希望它是GC,那么在循环后添加对GC.KeepAlive的调用。

答案 1 :(得分:1)

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

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

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


(*)同样,while似乎是一种静态方法。如果该方法将它返回的值存储在某种静态集合中,那么它可能仍然没有资格。