1

いくつかのコード流暢なオブジェクトをキャッシュするアプリケーションがあります。これらのキャッシュされたオブジェクトのいくつかを一時コレクションに入れると、コレクションがメモリから解放されることはありません。ANTS を使用してアプリケーションをプロファイリングすることで、悪役を見つけました。これは、オブジェクトがコレクションの「BaseAdd」関数でコレクションに挿入されるときにアタッチされるイベント ハンドラーです。

            cwProperty.KeyChanged += new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);

このイベントハンドラがアタッチされないようにするにはどうすればよいですか、またはこれをクリーンアップするにはどうすればよいですか?

4

2 に答える 2

0

コレクションが更新されないことがわかっているため、イベントハンドラーのサブスクリプションを削除して問題を解決しました。OnItemKeyChanged はプライベートであるため、呼び出すことができるパブリック関数を作成しました。

    public void RemoveOnItemKeyChangedHandlers()
    {
        foreach (var cwEntity in this)
        {
            cwEntity.KeyChanged -= new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);
        }
    }

上記の解決策は機能しましたが、最終的に、キャッシュするすべてのアイテムを ListCollections ではなく Lists に変更しました。誰かがこの問題を忘れて、別のメモリ リークが発生する可能性が非常に高かったのです。

于 2016-07-13T08:26:19.467 に答える