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。
答案 0 :(得分:1)
取决于socket
是否包含对它的引用。
如果socket
确实包含对ctx
的引用,那么它将不会是GC。
如果socket
没有对ctx
的引用,那么它可以用于GC。
如果您不希望它是GC,那么在循环后添加对GC.KeepAlive
的调用。
答案 1 :(得分:1)
这取决于。如果socket
维护对创建它的上下文的引用,则为no。(*)
如果没有,那么也许吧。如果您在非调试上下文中运行,那么在while
循环运行时可能被收集 - 当然,如果在{{1}的生命周期内没有收集循环比它不会被收集。
如果您正在调试中运行,那么所有局部变量都将保持活动状态,直到方法结束。
(*)同样,while
似乎是一种静态方法。如果该方法将它返回的值存储在某种静态集合中,那么它可能仍然没有资格。