4

私のアプリケーションには、メイン ウィンドウで開くいくつかのユーザー コントロールがあります。ユーザーコントロールを開いて閉じると思います。各ユーザー コントロールには、任意の情報フォームと同じように、 pictures 、 textbox 、および label があります。ガベージ コレクターによってメモリが再利用されないことに気付きました。アプリケーションのメモリ リークを解決するための脆弱性をインターネットで検索しました。私の質問に対するいくつかの良い答えが見つかりましたが、それらのほとんどは .net Framework 3.5 以前に関連していました。メモリ プロファイラーを使用して、いくつかのアドバイスに基づいて手がかりを見つけました。メモリ プロファイラを使用すると、オブジェクトへのバインドによって引き起こされる弱い参照が多数見つかりました。これはリンクに従っており、親コントロールを削除する直前にバインディングを削除しようとしましたが、問題は解決しませんでした。ここにxamlコード:

<TextBox x:Name="nameTextBox" Text="{Binding Name, Mode=TwoWay}"  />

モデルのインスタンスに DataContext を設定します。私のモデルは次のようになります

 public class MyModel : INotifyPropertyChanged
 {
    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            if (name!= value)
            {
                name= value;
                OnProperyChanged("Name");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnProperyChanged(string propertyName)
    {
        if (PropertyChanged != null)
           this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }`
    ...
}

次のコードを使用してバインディングをクリアしようとしました:

    BindingOperations.ClearBinding(nameTextBox,TextBox.TextProperty);

しかし、弱参照は消えませんでした。便利なコード プロジェクト ページを見つけましたが、これはイベント ハンドラー用です。最後に、私が言及したリンクを誤解している場合は、何をしなければならないかの手がかりを教えてください。バインディングの別の解決策がある場合。

注:リンクを確認しましたが、次の要素を削除する必要があることはわかっています。

  • 親ウィンドウ内のオブジェクトへのイベント ハンドラー
  • 静的オブジェクトからのイベントへの登録
  • タイマーの使用
  • データバインディング
  • テキスト ボックスの Text プロパティを変更する
4

1 に答える 1

5

弱参照の背後にある考え方は、オブジェクトへの参照を保持しても、ガベージ コレクションを防ぐことができないということです。代わりに、指しているオブジェクトが収集されると、すべての弱い参照が null に設定されます。

私はこれが実際に機能することを確信しています。そのため、オブジェクトが収集されない根本的な原因を探している場合は、弱参照を安全に無視できます。WPF ライブラリ オブジェクトは、問題を引き起こしている他の非弱参照を保持している可能性があり、これが発生する状況が文書化されています。

私はすべてのデータバインディングを再帰的に削除するコードを持っていましたが、これにはいくつかの醜い副作用があったため、この質問をしました。@Kent の回答のアドバイスに従うことをお勧めします。すべてのバインドが単一 (または少数)DataContextのプロパティに対して行われていることを確認し、それらを null に設定します。それに応じて、すべての WPF バインディングをきれいに切断する必要がありますDataContext

于 2013-10-05T17:18:33.470 に答える