2009-07-28 3 views

답변

8

끝났습니다. 이라는 Reflector에서 UnloadRecursive()System.Web.UI.Control에서 찾으십시오.

+0

Thx Duncan, 이것이 내가 본 최초의 진짜 증거입니다. –

5

아니요, 컨트롤에서 Dispose를 호출하면 안됩니다. 귀하는 컨트롤 구조 (FileStreams 등) 외부에서 생성하는 다른 일회용 객체에 대한 책임이 있습니다.

다음은 일반적인 .NET 원칙에 따른 것입니다. 페이지는 컨트롤의 소유자이므로 (명시 적으로) Dispose를 캐스케이드해야합니다. 실제 코드의 경우 Reflector에 Web.UI.Control 코드를 추가해야합니다. 이러한 응답 및 요청과 같은 페이지 속성을 페이지가 완전히 렌더링 된 후에

"언로드가 클라이언트로 전송,라고하며,이 시점에서 폐기 할 준비가 :

+0

나는 당신이 옳다는 것을 의심하지 않습니다. 나는 다른 누군가를 납득 시키려고 노력하고 있는데, 이것을지지할만한 어떤 참고 문헌도 감사 할 것입니다. –

+0

이 경우 가장 좋은 증거는 컨트롤을 정리하는 방법에 대한 기사가 부족하다고 생각합니다 (- : 조금 편집 할 것입니다.) –

+0

Henk은 정확합니다. "또는 다른 누군가"는 Microsoft의 기사를 보지 못했습니다. ASP.NET에서 "처형 루프"가있는 것은 그게 필요하지 않기 때문입니다 –

2

The ASP.NET Page Life Cycle에이 문서 상태. 언로드되고 모든 정리가 수행됩니다. "

"모든 정리"는 컨트롤을 처리하는 것을 의미합니다. ASP.NET 프레임 워크의 디자이너가이를 간과하고 아무도 눈치 채지 못했을 것이라고 상상할 수 없습니다.

1

다르게 해석하면이 질문은 눈을 뗄 때보 다 복잡합니다.

물론 Disposed이 호출되지만 아무 것도 수행합니까? 그것은 달려있다.

페이지 또는 컨트롤의 Disposed 이벤트에 가입했으며 요청 당 호출되는 경우 뱅킹중인 경우 놀랄 것입니다. 예, 기술적으로 ProcessRequestCleanup()을 말하는 것은 당신을 위해 그것을 호출하지만, 실제로 부르는 봐 가지고 : 디자인 화면없이

public virtual void Dispose() 
{ 
    IContainer service = null; 
    if (this.Site != null) 
    { 
     service = (IContainer) this.Site.GetService(typeof(IContainer)); 
     if (service != null) 
     { 
      service.Remove(this); 
      EventHandler handler = this.Events[EventDisposed] as EventHandler; 
      if (handler != null) 
      { 
       handler(this, EventArgs.Empty); 
      } 
     } 
    } 
    if (this._occasionalFields != null) 
    { 
     this._occasionalFields.Dispose(); 
    } 
} 

를이 코드는 본질적 Disposed 핸들러가 실행되지 않습니다 의미, 실행시 아무 작업도 수행하지 않습니다.

레슨은 요청 당 실행하기 위해 Disposed 처리기에 의존하지 않습니다. 그것을 무효화하여 무언가가 실행되도록 보장 할 수는 있지만, Unloaded은 훨씬 더 안전한 내기입니다.

관련 문제