2009-07-28 2 views

答えて

8

これは完了です。 ReflectorのUnloadRecursive()System.Web.UI.Controlから見ると、ProcessRequestCleanup()と呼ばれます。

+0

Thx Duncan、それは私が見た最初の本当の証拠です。 –

5

いいえ、コントロール上でDisposeを呼び出すべきではありません。あなたは、コントロール構造(FileStreamsなど)の外で作成する他の使い捨てオブジェクトを担当します。

これは一般的な.NETの原則に従います。このページはコントロールの所有者であり、したがって、(明示的な)廃棄をカスケードする必要があります。実際のコードでは、Web.UI.ControlのコードをReflectorに渡す必要があります。

+0

私はあなたが正しいとは思わない。私は他の誰かを説得しようとしていますが、あなたが知っているかもしれない参考資料があればそれを支持することに感謝します。 –

+0

この場合の最良の証拠は、あなたのコントロールを整理する方法に関する記事の欠如だと思う( - :しかし少し編集します) –

+0

Henkは正しいです。 –

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はもっと安全な賭けです。

関連する問題