2011-06-20 6 views
5

WebFormのすべてのコントロールが、各ポストバックの最後に破棄されると仮定すると、持っている可能性のあるイベントハンドラを「配線しない」必要があります有線接続?例えばのでASP.NET Webフォームでイベントハンドラを「結線する」必要があります

を(あなたがイベントの処理を停止し、GCを許可したいと仮定):

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Do I need to remove this handler? 
     btnSubmit.ServerClick += btnSubmit_ServerClick; 
    } 
} 

答えて

3

そう思わない。 WebForm1インスタンスの有効期間は、正しくリコールすればUnloadイベントの直後に終了します。あなたのWebForm1クラスへの継続的な参照が、ページが提供され、クリーンアップが行われた後であるかのようにではありません。

2

いいえ、あなたがする必要はありません。彼らはガベージコレクションされます。

0

ダイナミックコントロールでWebアプリケーション(Webフォーム)を1回作成すると、イベントを「拒否」する必要がありました。それ以外の場合は、ページが遅くなり、遅くなりました。 GCが気を配っていたと思っていた「古い」ページは依然として残っていました。 Page_Unloadでイベントを巻き戻したとき、私のアプリケーションは、存在しないページのイベントを引き上げることがなくなりました。

これは私に一度だけ起こりました。おそらく、アプリケーションの動的な性質によるものでした。思考のための

ただ、食品:)

0

これは、Webフォームを想定する単純すぎるのですが短命される - この例では、あなたは罰金に見えるが、一般的に、あなたは注意する必要があります。

今日、私は、ASP.NET WebFormsアプリケーションでイベントハンドラを強制終了しないとメモリリークが発生する@thmsnに似た良い例が発生しました。

この場合、ほとんどすべてのページで使用されているマスターページが、Page_Init内のオブジェクトのイベントにサブスクライブしていました。対象のオブジェクトは長期間存続し、ASP.NETセッションに保持され、サイトはInProcセッションストアを使用するように60分のタイムアウトで設定されました。イベントハンドラを終了しないと、オブジェクトは、GCがのGCが生存していればセッション中に(少なくともそれぞれの場合1時間)アクセスされたGCを妨げていることを意味しました。

Page_Unloadのイベントハンドラを短時間で修正することができました。この例では、ページの有効期間が無意識のうちに有効寿命を超えて簡単に拡張されることがわかります。ここでは理想とはかけ離れていましたが、ここでセッションを使用することはできません。また、ページライフタイムよりも適切な長さのオブジェクトからの後方参照でも同様のバグが発生しています。

+0

イベントハンドラを持つと、イベントのあるオブジェクトの存続期間が延長されることはありません。イベントを持つオブジェクトが存続している限り、ハンドラを持つオブジェクトの存続期間が延長されます。できません。あなたが持っているオブジェクトは両方ともページを参照する必要があります(別の方法ではなく)。 – Servy

+0

単純なタイプミス - オブジェクトのイベント(ハンドラではない)にサブスクライブします。修正されました。そして、私を信頼して、私には漏れを証明するためのダンプヒープがあります!乾杯:)セッションのオブジェクトのイベントを購読することは、オブジェクトがページへの参照を戻して、それを生きていることを意味します。 –

+0

イベントハンドラをイベントにサブスクライブしても、ハンドラがイベントを定義したオブジェクトへの参照を持つオブジェクトにはなりません。あなたは、あなたのケースでそのような参照を明示的に作成することができました。イベントハンドラの購読を中止しても問題は解決しないということを意味するイベントサブスクリプションの結果として必ずしも発生するとは限りません。あなたのページインスタンスが、長い時間がかかっていた他のオブジェクトにイベントハンドラをサブスクライブした場合、他のオブジェクトが周りにいる限り、* that *はページを保持しますが、それは別の状況です。 – Servy