C# while循环外部的对象将被GCed吗?
在执行下面的while循环期间,对象ctx是否会被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维护对创建它的上下文的引用,则否(*) 如果没有,那么可能。如果您
我认为堆栈中有一个引用存储在引用对象的引用中,只有当方法退出时,堆栈才会被清除,因此引用才会被清除,只有这样对象才会被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);
}
}
}