0

ソース管理リポジトリからの変更の履歴ログを表示するアプリを構築しています。このアプリは、.NET 4 WPF および Entity Framework Code First で実装されています。

私が直面している問題の 1 つは、時間の経過とともに、より多くのログ エントリがログに追加されるにつれて、アプリケーションがより多くのメモリを使用し、ログ エントリへの参照を解放しないことです。各ログ エントリには、「変更されたファイル」のリストと、変更されたファイルごとに、ファイルの前後のバージョンが保持されます。

LogEntryUI には、ログ エントリのリストと、現在選択されているとの古いバージョンと新しいバージョンの差分が表示されますChangedFile。データモデルはおおよそ次のとおりです。

public class LogSubscription
{
    public List<LogEntry> Log { get; set; }
}

public class LogEntry
{
    public List<ChangedFile> ChangedFiles { get; set; }
}

public class ChangedFile
{
    public string OldVersion { get; set; }
    public string NewVersion { get; set; }
}

私は EF Code First を使用しているため、List プロパティにアクセスするだけで、データベースがクエリされ、オブジェクト モデルが自動的に構築されます。私がやりたいことはChangedFiles、一定時間後に何らかの方法でリストを参照解除し、データベースを再クエリし、必要に応じてオブジェクト モデルを再構築することです (つまり、ユーザーがログ エントリをクリックして戻した場合)。

EF Code First でこれを行う方法はありますか? それとも、使用するメモリを制御するために別のアプローチをとるべきですか?

アプリと完全なソース コードは、 https ://github.com/tomhunter-gh/SourceLog の GitHub でホストされています。

4

1 に答える 1

1

コメントで述べたように、これは破棄されない静的コンテキストで発生する可能性があります。ソースには、ThreadStaticContextBackgroundによって使用される があることがわかりますLogEntry: アクティブレコードのようなパターンでは、コンテキストが必要なメソッドLogEntryによってそれ自体を保存します。MarkAsReadAndSave

ログエントリを保存する際に多くのコンテキストを作成および破棄するのを防ぐために、おそらくこれを行いました (私はソースを実際に精査しませんでした)。しかし、アクティブ レコードのアプローチを再考する必要があると思います。ログ エントリは によって保存されますMainWindowViewModel。ビュー モデルは、短命のコンテキストによってログ エントリを保存し、場合によってはエントリをキャッシュして表示などに使用できるようにするサービス メソッドを呼び出す必要がありますRemovedItemsDgLogSelectionChangedアイテムごとのコンテキスト。それは意味がありますか?

于 2012-10-29T11:23:29.750 に答える