イベントをログに記録するためのクラスを作成しています。私の LogClass はシングルトンとして実装されており、システム内のどのクラスでもログ エントリを書き込むことができます。エントリはリストに保存され、バッファがいっぱいになるとディスクにダンプされます。
実行中に LogClass の内容を表示するために DataGridView を使用しているため、BindingList を使用して Viewer が自動的に更新されるようにしました。
私のクラスがどれほどスレッドセーフなのか疑問に思っています。リストに新しいエントリを追加するたびに「ロック」を使用しています。また、リストを繰り返し処理してディスクにダンプするときも使用しています。DataGridView 以外に、ログから読み取るオプションがなく、エントリをログに追加するためのオプションがないため、このクラスは基本的に書き込み専用です。ダンプは内部で実行され、BindingList に明示的な読み取りコマンドがあるのはそのときだけです。
だから私の本当の懸念は、 DataGridView と BindingList で何が起こっているのですか? BindingList は、リストが変更されるたびにイベントをスローします。追加が完了するとイベントがスローされるため、新しいエントリを追加する場合、これは問題ではないようです。
Dump() の私のコードは次のとおりです。
lock (lockObj) {
foreach (LogEntry le in List) {
writeToDisk(le)
removeFromList(le)
}
}
繰り返し全体でリストをロックしているにもかかわらず、イベントがビューアーにスローされ、リストが変更された (削除のため) ため、DataGridView によって読み取られます。リストを変更している間、リストへの読み取り/書き込みは本当に必要ありません。何か案は?