ControlクラスでIDisposableが実装されているとすれば、ASP.Netは少なくとも、ページのライフサイクルが終了したときにDisposeカスケードをトリガーできると思うでしょうか?ASP.Netはページ内のページ/コントロールをDisposeに呼び出しますか?これを行う必要がありますか?
簡単な質問:これが該当するのですか、それともする必要がありますか?
ControlクラスでIDisposableが実装されているとすれば、ASP.Netは少なくとも、ページのライフサイクルが終了したときにDisposeカスケードをトリガーできると思うでしょうか?ASP.Netはページ内のページ/コントロールをDisposeに呼び出しますか?これを行う必要がありますか?
簡単な質問:これが該当するのですか、それともする必要がありますか?
これは完了です。 ReflectorのUnloadRecursive()
をSystem.Web.UI.Control
から見ると、ProcessRequestCleanup()
と呼ばれます。
いいえ、コントロール上でDisposeを呼び出すべきではありません。あなたは、コントロール構造(FileStreamsなど)の外で作成する他の使い捨てオブジェクトを担当します。
これは一般的な.NETの原則に従います。このページはコントロールの所有者であり、したがって、(明示的な)廃棄をカスケードする必要があります。実際のコードでは、Web.UI.ControlのコードをReflectorに渡す必要があります。
私はあなたが正しいとは思わない。私は他の誰かを説得しようとしていますが、あなたが知っているかもしれない参考資料があればそれを支持することに感謝します。 –
この場合の最良の証拠は、あなたのコントロールを整理する方法に関する記事の欠如だと思う( - :しかし少し編集します) –
Henkは正しいです。 –
The ASP.NET Page Life Cycle上のこの記事では、と述べている:ページが完全に、レンダリングされたクライアントに送信され、そして廃棄される準備ができてされた後
は、「アンロードが呼び出され、この時点では、このような応答やリクエストなどのページのプロパティ。アンロードされ、クリーンアップが実行されます。
「すべてのクリーンアップ」とは、コントロールの廃棄などを意味します。ASP.NETフレームワークの設計者がそれを見落とし、誰も気付かなかったとは想像もできません。
異なって解釈されると、この問題は目に見えるよりも複雑です。
確かに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
はもっと安全な賭けです。
Thx Duncan、それは私が見た最初の本当の証拠です。 –