0

フォームの存続期間中存続する必要のある管理対象オブジェクトを所有するIDisposableフォーム(つまり、クラスレベルのメンバー、おそらく単体テストのためにラップしてタイマーを管理するクラス)がある場合、いつDispose()それらを呼び出す必要がありますか?

質問のために(「GCがあなたに代わってそれを破棄する」タイプの回答を避けるために)、私が呼び出す必要のある追加のシャットダウンロジックがあると仮定しましょう。たとえば、次のようになります。

Buffer.Flush()
Buffer.Dispose()

Dispose()部分クラス( )のメソッドの既存の実装にそれを入れることはできますが、Form.Designer.vbそのクラスを変更することは通常、眉をひそめます。

FormClosedまたはDisposedイベントが最良の選択であるように思われます。どちらかを選択する理由はありますか?

4

3 に答える 3

2

「適切な」方法は、Dispose() メソッドをフォームの Designer.vb ファイルからフォームのソース コード ファイルに移動して編集することです。ただし、これは vb.net IDE では厄介です。そのファイルが隠されます。表示するには、[すべてのファイルを表示] アイコンをクリックする必要があります。

FormClosed の使用は間違っています。フォームが ShowDialog() で表示されたときに、オブジェクトを破棄するのが早すぎます。ダイアログの結果を取得するときに ObjectDisposed 例外が発生する可能性があります。

Disposed イベントを使用しても問題ありません。

于 2012-07-09T20:43:08.860 に答える
0

C# winforms では、Dispose()メソッドの実装をデザイナーからコード ビハインド ファイルに移動します。それで問題があったことはありません。VBでも同じことができると思います。

唯一重要なことは、Componentsコレクションを破棄するコードを保持することです。

于 2012-07-09T20:31:56.147 に答える
0

using一般的に言えば、たとえばステートメントを使用して、安全に解放できるようになったらすぐに、管理されていないリソースを解放するようにしてください。これにより、通常、リソースを「念のため」または完全に不必要に利用できるようにしておく場合よりも、アプリケーションの保守がより安全になり、リソースのライフサイクルに関連するデッドロックやその他の誤動作が発生しにくくなります。

ただし、パフォーマンス上の理由からアンマネージ リソースを「キャッシュ」する必要がある場合や、セマンティックな理由 (UI レベルでの相互排除のための意図的なロック スキームなど) で管理されていないリソースを保持する必要がある場合もあります。

このような場合、親オブジェクトのDisposefromを呼び出すのが適切な規則です。Disposeこの場合、Disposedイベントを処理します。

FormClosed別のハンドラーがクローズの発生を妨げたり、親フォームのハンドラー コードがこのフォームのメソッドを呼び出したりして、破棄されたリソースを使用することになる可能性があるため、リスクが高くなります。Disposeこれに加えて、フォーム全体で が直接呼び出されたときにリソースが解放されないというリスクがあります。

コードを配置する主な利点はFormClosed、「健全な」操作環境、特に親フォームへのアクセスです。ただし、管理されていないリソースを破棄するためにこれが必要になることはめったにありません。

于 2012-07-09T20:33:54.380 に答える