2013-01-07 2 views
0
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가 GCed됩니까? 나는 참조가 객체를 참조하는 스택에 저장되어 있다고 생각한다. 메소드가 종료 될 때만 스택이 지워 지므로 참조가 지워진다. 객체가 GCed되어야한다.외부는 GCed 될 때까지 반대 할 것입니까?

답변

1

에 따라 다릅니다. socket이 생성 된 컨텍스트에 대한 참조를 유지하면 아니오 (*)

그렇지 않으면 어쩌면. 디버그가 아닌 컨텍스트에서 실행중인 경우 while 루프가 실행되는 동안 이 될 수 있습니다. 물론 수집되지 않는 루프가 while 루프의 수명 동안 발생하지 않으면이 루프가 실행됩니다.

디버그에서 실행중인 경우 모든 로컬 변수는 메소드가 끝날 때까지 활성화됩니다.


(*)는 마찬가지로 ZmqContext.Create 정적 방법으로 나타난다. 이 메서드가 반환하는 값을 일종의 정적 컬렉션에 저장하면 해당 속성이 여전히 적합하지 않게됩니다.

+0

왜 그렇게 생각합니까, 참조가 스택에 저장되어있을 때 메소드를 종료 할 때만 스택이 지워져서 참조가 지워지고 오브젝트가 GCed되어야합니다. – Benny

+0

@Benny - 아니요, 릴리스 모드에서 JIT와 GC가 공동 작업하므로 현재 메소드에서 더 이상 참조되지 않는 변수가 루트로 작동하지 않습니다. 이것이 제 두 번째와 세 번째 단락에서 다루고있는 것입니다. –

1

socket에 대한 참조가 있는지 여부에 따라 달라집니다.

ctx에 대한 참조가있는 경우 socket은 GC하지 않습니다.

ctx에 대한 참조가없는 경우 GC 용으로 사용할 수 있습니다.

GC를 수행하지 않으려면 루프 다음에 GC.KeepAlive에 대한 호출을 추가하십시오.

관련 문제