2009-05-14 2 views
5

.Net에서 비동기 프로세스 (해당 메서드 중 하나에서 Delegate.BeginInvoke 사용)를 시작한 객체를 인스턴스화 한 다음 객체에 대한 참조를 null로 설정하거나 객체가 범위를 벗어나는 것을 허용하여 객체를 포기한다고 가정합니다. 비동기 프로세스가 진행되는 동안 가비지 콜렉터가 오브젝트를 수집하려고합니까? 그렇지 않다면 무엇이 객체를 수집하지 못하게합니까?.NET GC에서 버려진 개체가 메서드를 비동기 적으로 실행하여 엉망이 되나요?

답변

12

완전히 관리되는 코드 인 경우 수집되지 않습니다.

당신이 해고하는 대의원은 (설명에서) 그 대상의 일부입니다. 실행되고있는 한, 객체에 대한 활성 참조가 있습니다. 대리인이 완료 되 자마자 개체가 컬렉션 후보가됩니다.

그러나 대리자에서 네이티브 코드를 호출하는 경우 네이티브 코드가 완료되기 전에 개체를 실제로 마무리 할 수있는 경우가 있습니다. 자세한 내용은 MSDN forum thread을 참조하십시오.

+0

위대한, 총 의미합니다. 나는 이것을 조금 더 확장해야한다. AsyncCallback을 BeginInvoke에 전달하여 비동기 프로세스가 완료되면 Finalization 처리 및 EndInvoke를 호출 할 수 있습니다. 이 AsyncCallback이 완료 될 때까지 대리자 호출이 완료되지 않았습니까? 따라서 AsyncCallback이 종료 될 때까지 객체가 콜렉션 후보가되지 않습니다. –

+0

예. http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult_members.aspx를 참조하십시오. AsyncDelegate 속성에 대리자에 대한 핸들이 있으므로 개체가 처리됩니다. 콜백이 끝날 때까지는 GC에 대한 후보가되지 않습니다. –

+0

완벽하고 대단히 감사합니다. –

관련 문제