我正在写一个记录事件的类。我的 LogClass 实现为单例,系统中的任何类都可以写入日志条目。这些条目存储在一个列表中,当缓冲区被填满时,它们被转储到磁盘中。
我在执行期间使用 DataGridView 来显示 LogClass 的内容,因此我使用了 BindingList 以便查看器会自动更新。
我想知道我的班级的线程安全性如何。每次我向列表中添加一个新条目时,以及当我遍历列表以将其转储到磁盘时,我都会使用“锁定”。除了 DataGridView 之外,该类基本上是只写的,因为没有从日志中读取的选项,只能将条目添加到日志中。转储在内部执行,这是唯一一次在 BindingList 上有明确的读取命令。
所以我真正关心的是 DataGridView 和 BindingList 发生了什么?每次列表更改时,BindingList 都会引发一个事件。添加新条目时这似乎不是问题,因为添加完成时会引发事件。
我的 Dump() 代码是:
lock (lockObj) {
foreach (LogEntry le in List) {
writeToDisk(le)
removeFromList(le)
}
}
即使我在整个迭代过程中锁定了列表,也会向查看器抛出一个事件,该列表已更改(由于删除),因此被 DataGridView 读取。在更改列表时,我真的不希望对列表进行任何读/写。有任何想法吗?