2011-11-09 14 views
4

私はかなり複雑なアプリケーションを継承しましたが、私はフォームに関係するメモリリークを追跡しようとしています。今、フォームが閉じられ、新しいフォームが呼び出されるたびに、古いフォームがメモリに残ります。私はプログラム内のコントロールによって所有され、設定された静的イベントに関する問題を追跡しました(静的イベントが設定されている限り、そのコントロールのインスタンスはスコープ外とはみなされませんでした。 )。今、残りの問題を追跡しようとしています。C# - 残りのEventHandlerがコントロールのスコープ外への移動を見つけようとしています

FormOpenWatch  <--  The item which remains active 
System.EventHandler -- (this as Delegate)._target 
System.Object[] 
System.EventHandler -- (this as MultiCastDelegate)._invocationList 
System.ComponentModel.EventHandlerList+ListEntry -- handler 
System.ComponentModel.EventHandlerList+ListEntry -- next 
System.ComponentModel.EventHandlerList+ListEntry -- next 
System.ComponentModel.EventHandlerList+ListEntry -- next 
System.ComponentModel.EventHandlerList+ListEntry -- next 
System.ComponentModel.EventHandlerList -- head 
PTU.MdiPTU -- (this as Component).events  <--  The base application 

誰もが私が探していかもしれないもののために任意の洞察力を持っている:MemProfilerとANTSメモリプロファイルを使用し

は、私は、ルート実行パスはこのように書きますことを学びましたか?私は、表示されたイベントが基本アプリケーションに追加されたことを確認し、フォームが破棄されているときに削除されることを確認しましたが、問題を修正していないようです。

ご協力いただきありがとうございます。

後で編集:私はこれを何回もうまく解決したと思っていますが、まだ問題があります。問題は、この "public static event MouseEventHandler MultiCursorMouseMove;"を持つ私のPlotterクラス(および様々な派生クラス)に由来しているようです。イベント。マウスの位置にグラフの値と時間を表示する "カーソル"があります。もともと、これは一度に1つのグラフで機能しましたが、ユーザがマウスを動かして表示されたすべてのグラフにプロットを移動したモードを切り替えることができるように要求されました。アイテムがインスタンス化されたときにEventHandlersをフックする最初の処理を書いていました。池の向こう側のパートナーは、静的イベントを使用するためにそれを書き換えました。彼のやり方ははるかにエレガントで、うまく機能します。すべてがメモリリークを引き起こしていることを除いて。メモリプロファイリングソフトウェアを使用すると、プロットを保持しているフォームを取り除こうとするたびに、「直接のEventHandlerルートでインスタンスを破棄する」というケースがいくつか残されています。これらのそれぞれでは、オブジェクトがプロッタかプロッタが指すオブジェクトのいずれかであることを示しています。そして、これらのそれぞれにおいて、基本リンクはMultiCursorMouseMove EventListがこれらのオブジェクトを指し示すことです。私は起こっていることは、Plotterがこの静的イベントを持っているためにPlotterが生きているということです。これはPlottersにリンクされています。私はMultiCursorMouseMoveが、各Plotterのイベントを削除してDisposeコードを使って、ある時点でMultiCursorMouseMoveがnullであることを確認しましたが、その時点でProfilerを実行してもMultiCursorMouseMoveからこれらのクラスにこのチェーンが表示されます。

私は現在この問題を解決する方法がありません。誰でも?

+1

イベント_outside_自体を購読するには、ウォッチフォームをスキャンします。 –

+0

なぜそれを_static_イベントと呼びますか? –

+0

パブリック静的イベントMouseEventHandler MultiCursorMouseMove; –

答えて

1

MdiPTUがアプリケーションのMDI親フォームである場合、FormOpenWatchがそのイベントの1つにサブスクライブしているように見えます。これを直接行っていない場合は、FormOpenWatchスーパークラス、またはおそらくMdiPTUイベントからFormOpenWatchメソッドの実行を呼び出す可能性のある他のコードでもサブスクリプションを見つけることができます。

+0

MdiPTUのFontChangedイベントを購読している親クラスが本当に興奮しているケースが1件見つかりましたが、イベントリストから削除されていることを確認しましたそれを握っている参照があります。次のアイデアに...しかし、おそらく正しい方向に何がポインタでありがとう。 –

+0

@SeanDuggan:これは問題ではありません。これらの参照がどのように格納されるのか混乱しています。イベントを購読すると、* subscribee *は* subscriber *への参照を保持します。だからあなたの例では、それは違いはありません。子フォームがどこよりも長く存在するオブジェクトのイベントにサブスクライブする場所を見つける必要があります。それ以外の方法ではありません。 –

+0

私は誤解している可能性があります。私が上で述べたことを説明するために、FormOpenWatchの親クラスであるFormShowDataPlotの親クラスであるFormPTUは、MainWindowという名前のMdiPTUインスタンスへの参照を持っています。 FormPTU_Shownメソッド内で、次のステートメントが実行されます。 "MainWindow.FontChanged + = new System.EventHandler(ChangeFont);" 私はそれをテストする方法はわかりませんが、おそらく問題は複数回追加されているのだろうかと思い始めました。 –

関連する問題