2011-10-07 2 views
3

GCHandle.Alloc (Object) 계약을 엄격하게 이해하고 싶습니다. 나는 또한 그 foo는 이해 GCHandle.Alloc (Object) 계약은 정확히 무엇입니까?

gc.Free(); 

이 경우 수집 얻을 것이다 : 나는 호출 할 때까지

GCHandle gc = GCHandle.Alloc(foo); 

foo는 쓰레기 수집되지 않도록 보장됩니다

은 내가 호출하면 그 문서에서 이해 AppDomain이 언로드됩니다.

무료로 호출하지 않고 Alloc에 ​​대한 호출이 사실상 (GC의 관점에서) 루트 참조와 같은지 확인하고 싶습니다.

이것이 사실이라면 GCHandle 변수 gc의 범위는 foo의 수명에 영향을주지 않습니다. Free가 호출되지 않으면 AppDomain이 언로드 될 때까지 foo가 실행됩니다.

예. 개체가 Alloc을 호출하고 GCHandle 인스턴스를 유지하지 않으면 AppDomain이 언로드 될 때까지 계속 실행됩니다.

이 정보가 맞습니까?

일부 참조 :

http://msdn.microsoft.com/en-us/library/a95009h1.aspx

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.free.aspx

http://blogs.msdn.com/b/clyon/archive/2005/03/18/398795.aspx

+0

누군가이 행동을 이용하려고하는 이유는 무엇입니까? –

+0

많은 사람들이 이미 있습니다. 이것은 싱글 톤 패턴이라고 불리며, GCHandle을 사용하지 않아도됩니다. 단순히 객체에 대한 정적 참조를 작성하십시오. 참조가 해제되지 않는 한 수집되지 않습니다. –

+0

@ 짐 솔직히 말해서 이해를 명확히 해줄 것을 부탁합니다. 앱 도메인의 긴 라이프 사이클을 계획하고 있지 않습니다. (대표자가 관리되지 않는 코드의 콜백으로 싸서이 설명이 유용하다고 생각한 안전한 라이프 사이클을보고 있습니다) . – morechilli

답변

1

수정. GCHandle 변수는 GCHandle.Alloc()에 전달한 객체의 수명에 영향을 미치지 않습니다.

class Test 
{ 
    public Test() 
    { 
     System.Runtime.InteropServices.GCHandle.Alloc(this); 
    } 
    ~Test() 
    { 
    } 
} 
class Server : MarshalByRefObject 
{ 
    public Server() 
    { 
     new Test(); 
    } 
    public void Collect() 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

그리고 다음 테스트 코드 : 나는 다음과 같은 두 개의 클래스로이 문제를 확인 당신이 테스트 클래스의 종결 자에 중단 점을 설정하면이 예제를 사용

AppDomain ad = AppDomain.CreateDomain("test"); 
Server svr = (Server)ad.CreateInstanceAndUnwrap(
    System.Reflection.Assembly.GetExecutingAssembly().FullName, 
    typeof(Server).FullName); 
for (Int32 i = 0; i < 100; i++) 
    svr.Collect(); 

, 당신은이 점에 유의한다 GC.Collect/WaitForPendingFinalizers 호출 중 호출되지 않습니다. 그러나 중단 점은 appdomain이 언로드 될 때 발생합니다.

+0

고마워 - 내가 sos.dll을 사용하여 예제를 사용하여 몇 가지 테스트를했는데! finalizequeue - 이미 이것이 결론을 뒷받침했다. – morechilli