6

RoutedUICommand への CommandBinding を持つユーザー コントロールを作成すると、メモリ リークが発生するのではないかと心配しています。

シナリオ:

RoutedUICommand を c クラスの static として使用し、コマンドを格納します。ユーザー コントロールに CommandBindings を実装します。ユーザー コントロールをメイン フォームに追加します。メイン フォームからユーザー コントロールを削除し、それへの参照を null に設定します。

コマンド バインディングの canExecute は引き続き起動します。UserControl への参照がないため、リークしています。フォームが閉じられた後も長時間発火し続けます。(停止するのを見たことがありません)ガベージコレクションを強制すると、収集されます(canExecuteの起動が停止します)

これを説明するテストプロジェクトがあります。メソッドを起動するオブジェクトのハッシュ コードを出力する canExecute に Console.WriteLine があります。新しいユーザー コントロールを追加するためのボタンと、それを削除するためのボタンがあります。

これは気にしなくていいのでしょうか?強制された場合、ユーザーコントロールは収集されます。これは、次のコレクションで収集されるということですか? アプリのパフォーマンスの低下に気づき、メモリ リークなどを追跡しています。多くの UI 要素を含む複雑なフォームがあり、レイアウトから削除すると、プロセッサとメモリ領域を使い果たしています。(多くのコマンドを使用します) ビジュアル ツリーから何かを削除すると、ルーティング イベントを受信できなくなると思いました。私は何が欠けていますか?

4

1 に答える 1

2

私の理解では、コマンドバインディングは、 WeakEventパターンに似たものを使用します(ただし、同じではありません)。

基本的に、WeakReferenceが保持されます。これにより、参照がなくなった後でも機能するようになりますが、他に何も参照されていないときにクラスがGCによって収集されるのを防ぐことはできません。

要するに、心配しないでください-それはそれが機能するはずのように機能しています。

于 2010-01-08T05:55:51.537 に答える