私はかなり複雑なアプリケーションを継承しましたが、私はフォームに関係するメモリリークを追跡しようとしています。今、フォームが閉じられ、新しいフォームが呼び出されるたびに、古いフォームがメモリに残ります。私はプログラム内のコントロールによって所有され、設定された静的イベントに関する問題を追跡しました(静的イベントが設定されている限り、そのコントロールのインスタンスはスコープ外とはみなされませんでした。 )。今、残りの問題を追跡しようとしています。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からこれらのクラスにこのチェーンが表示されます。
私は現在この問題を解決する方法がありません。誰でも?
イベント_outside_自体を購読するには、ウォッチフォームをスキャンします。 –
なぜそれを_static_イベントと呼びますか? –
パブリック静的イベントMouseEventHandler MultiCursorMouseMove; –