Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# while循环外部的对象将被GCed吗?_C#_Garbage Collection_While Loop - Fatal编程技术网

C# while循环外部的对象将被GCed吗?

C# while循环外部的对象将被GCed吗?,c#,garbage-collection,while-loop,C#,Garbage Collection,While Loop,在执行下面的while循环期间,对象ctx是否会被GCed? 我认为堆栈中有一个引用存储在引用对象的引用中,只有当方法退出时,堆栈才会被清除,因此引用才会被清除,只有这样对象才会被GCed。这取决于socket是否持有对它的引用 如果socket确实包含对ctx的引用,那么它将不会被GC调用 如果socket不包含对ctx的引用,则它可以用于GC 如果您不希望它是GC,那么在循环之后添加对的调用。这取决于具体情况。如果socket维护对创建它的上下文的引用,则否(*) 如果没有,那么可能。如果您

在执行下面的while循环期间,对象ctx是否会被GCed?
我认为堆栈中有一个引用存储在引用对象的引用中,只有当方法退出时,堆栈才会被清除,因此引用才会被清除,只有这样对象才会被GCed。

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

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

如果
socket
不包含对
ctx
的引用,则它可以用于GC


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

这取决于具体情况。如果
socket
维护对创建它的上下文的引用,则否(*)

如果没有,那么可能。如果您在非调试上下文中运行,则可能会在
while
循环运行时对其进行收集-当然,如果
while
循环的生存期内未发生任何收集,则不会对其进行收集

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



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

为什么,我认为堆栈中存储了一个引用对象的引用,只有当该方法退出时,堆栈才会被清除,因此引用才会被清除,只有在该对象被GCed时。@Benny-否,在释放模式下,JIT和GC进行协作,因此当前方法中不再引用的变量不会充当根。这就是我的第二和第三段所述。
 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);
            }

        }
    }