0

私はUI、winformを持っています。タブコントロール、たくさんのテキストボックス(タブ全体に最小25個)コンボボックス、チェックボックス、ボタン、ラベル、ツリーコントロールなどのコントロールがたくさんあります。

これらのコントロールのほとんどは、textchanged、click などの ctrl イベントに登録されます。メモリ不足の例外が発生しているため、クエリはほとんどありません。

質問:

  1. フォームの dispose 関数では、この ctrl のそれぞれを dispose する必要があります。
  2. textchanged、クリック イベントなどの ctrls によってサブスクライブされたイベントは、dispose 関数で登録解除する必要がありますか? コード スニペットがデザイナーに追加されるため、GC は ctrls に追加されたイベントの登録解除を処理しますか?

いくつかの情報: アプリケーションは、2GB の RAM マシンで最大 100 回の反復の安定性テストにかけられました。反復ごとに同じテストを実行します(ダイアログの起動、クリックの実行、値の編集、および終了)。それはほぼ8時間実行されていました。45回目または46回目の繰り返しで、この例外がスローされました。はい、ダイアログ内のすべてのコントロールには、1 つのイベントまたはその他のイベントが登録されています。いくつかのテキストが変更された いくつかのチェックされた変更またはクリックなど

4

1 に答える 1

1

何が起こっているのかを正確に伝えるのに十分な情報がここにあるとは思いません。これには、コードを注意深く分析する必要がありますが、最初に行うことは、メモリプロファイラーを介してアプリを実行することです。たとえば、ANTSメモリプロファイラですが、実際にアクセスできるものなら何でも問題なく動作します)、実際に何が起こっているかを確認します。

通常、すべてのコントロールを明示的に破棄する必要はありませんが、イベントをサブスクライブしている場合は、通常よりも長くメモリ内で問題が発生する可能性があります。この質問には厄介な詳細がありますが、一言で言えば、購読を解除するか、弱参照を使用してそれを修正する必要があります。すべてのフォームコントロールを列挙してを呼び出す必要はありませんDispose。私が思い出すと、それがForm.Close()MDIフォームであり、呼び出されたときに表示されない場合を除いて、とにかく呼び出される必要がありCloseます。

また、保存しているデータとその方法、およびアプリケーションが使用している可能性のあるリソースを適切に破棄しているかどうかも確認する必要があります。

32ビットシステムで実行している場合は、プロセスごとのメモリ制限である2GBに対して実行している可能性もあります。これは、たとえば、List1GBに増加し、サイズを変更する必要がある場合にヒットする可能性があります。

したがって、プロファイラーを使用して調査を開始します。:)

于 2012-09-27T05:29:44.017 に答える