2

私の会社のエンタープライズ ソリューションでは、できる限り多くのメモリ リークを調べて一掃しています。

他の多くのフォーム (たとえば、RecommendationCaptureForm) によって継承される BaseCaptureForm があります。システム全体で (たとえば)、この RecommendationCaptureForm はモーダルに呼び出されます (ShowDialog())。私の知る限り、フォームがモーダルに開かれるときは、using ステートメントでラップするか、完了したら破棄する必要があります。

BaseCaptureForm にはヒットしない dispose メソッドがあります。ファイナライザーを入れましたが、ヒットすることはありません。ANTS Memory Profiler は、これらすべてのフォームがメモリに保持されていることを示しています。

メモリリークを止めるために、これらのキャプチャフォーム (それほど長く開いていない) を破棄する方法について誰か提案がありますか? システム全体で何百万もの ShowDialog 呼び出しがあり、他の誰かがこの問題に遭遇したかどうか疑問に思っていましたか?

編集 明確にするために、閉じたら BaseCaptureForm で自動的に破棄するためにできることはありますか? それらを破棄することを期待して、すべての ShowDialog() 呼び出しを実行することはできません。フォームの OnClosed イベントで dispose メソッドを呼び出すと、厄介なちらつきが発生します。

4

3 に答える 3

2

フォームを閉じた後のフォームの使用方法に応じて (*)、FormClosed イベント ハンドラー内から Dispose() を呼び出すことができます。

あなたが言及している「厄介なちらつき」は見られません。試してみることの1つthis.Visible = falseは、 FormClosed イベントハンドラーで設定することです。

(*) 公開されているプロパティまたはフォームのメソッドを介してコントロールまたはコントロールのプロパティを公開していない限り、安全である可能性があります。これを回避する 1 つの方法は、このようなパブリック プロパティをバッキング フィールドで実装し、フォームを閉じる前にコントロールからこれらのバッキング フィールドにデータをコピーすることです。

コードを見ないと、これがあなたのシナリオで現実的かどうかを判断するのは困難です。using正直なところ、ステートメントを追加して呼び出しをクリーンアップし、弾丸をかじる傾向があります。

于 2011-04-19T16:39:16.843 に答える
1

ダイアログの破棄が呼び出されない場合、これはフォーム内でスローされる例外の指標になる可能性があります。このブログ投稿をご覧ください。

「Ms Dispose パターン」を実装しましたか? これは、ソリューションにも役立ちます。多分あなたはいくつかのコードを提供できますか?

これがあなたの助けになることを願っています...

于 2011-04-19T15:48:33.853 に答える
1

残念ながら、これを行う簡単な方法はありません。あなたが持っているのは悪いコードであり、その悪いコードは他のすべての悪いコードと同じように修正する必要があります: それを修正して良いコードに置き換えることです。ここに適用するバンドエイドはありません。バンドエイドはForm呼び出しのファイナライザーであり、発生するDispose()ことが保証されていません。オブジェクトがコレクションに不適格である場合、ANTS Memory Profiler はそのオブジェクトへの参照を保持しているものを表示します。

于 2011-04-19T19:32:58.647 に答える