2016-07-10 1 views
1

私はいくつかのコードフルオブジェクトをキャッシュするアプリケーションを持っています。それらのキャッシュされたオブジェクトのいくつかを一時的なコレクションに入れても、コレクションは決してメモリから解放されません。 ANTSでアプリケーションをプロファイリングすることで、私はvillanを見つけました:オブジェクトがコレクションの 'BaseAdd'関数のコレクションに挿入されたときに添付されるイベントハンドラ。OnItemKeyChangedイベントのためCodefluentメモリリーク

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

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

答えて

1

エンティティのデフォルトの収集タイプはListCollectionです。したがって、生成されたコレクションは、listおよびdictionaryにデータを格納します。これにより、索引またはそのキーを使用して項目にアクセスできます。このコレクションにアイテムを追加すると、コレクションは必要に応じて辞書を更新できるように、KeyChangedイベントを登録する必要があります。コレクションから要素を削除すると、そのイベントは切り離されます。

キーを使用してアイテムにアクセスしない場合は、コレクションタイプをListに変更できます。したがって、辞書がないので、KeyChangedイベントを登録する必要はありません。

<cf:entity name="Customer" setType="List"> 
    <cf:property name="Id" /> 
    <cf:property name="FullName" /> 
</cf:entity> 
+0

私はすでに考えていましたが、問題は、コードフローコレクションを使用するインターフェイスでコレクションが必要であるということです。イベントハンドラの購読を削除して問題を解決しました。更新を参照してください... –

0

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

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

上記の解決策が実行されている間、私は最終的にListCollectionsの代わりにキャッシュする項目をすべてリストに変更しました。誰かがこの問題を忘れて、別のメモリリークを起こす可能性は大きかったです。

+0

注意してください! listcollectionの代わりにコレクションを変更すると、パフォーマンスが低下します。 –

関連する問題