c# - 在 C# 中使用 DataGridView 和 BindingList 时的线程安全建议

标签 c# logging datagridview thread-safety bindinglist

我正在编写一个用于记录事件的类。我的LogClass是单例实现的,系统中的任何类都可以写入日志条目。条目存储在列表中,当缓冲区已满时,它们会转储到磁盘。

我在执行期间使用 DataGridView 来显示 LogClass 的内容,因此我使用了 BindingList 以便查看器自动更新。

我想知道我的类的线程安全性如何。 每次向列表中添加新条目时,以及遍历列表以将其转储到磁盘时,我都在使用“锁定”。 除了 DataGridView 之外,该类基本上是只写的,因为没有从日志中读取的选项,只能将条目添加到日志中。 转储在内部执行,这是唯一一次在 BindingList 上有明确的读取命令。

所以我真正关心的是 DataGridView 和 BindingList 发生了什么? 每次列表更改时,BindingList 都会抛出一个事件。 添加新条目时,这似乎不是问题,因为添加完成后会抛出该事件。

我的 Dump() 代码是:

lock (lockObj) {
    foreach (LogEntry le in List) {
      writeToDisk(le)
      removeFromList(le)
    }
 }

即使我在整个迭代过程中锁定列表,也会向查看器抛出一个事件,表明列表已更改(由于删除),因此被 DataGridView 读取。在更改列表时,我真的不想对列表进行任何读/写操作。 有什么想法吗?

最佳答案

这不是真正的问题,因为一旦绑定(bind),您只能通过 Form.Invoke 方法(继承自 Control.Invoke)更改列表。如果您尝试从另一个线程更改列表,.NET 运行时将对您发出异常警告,说“无法从当前线程更改此列表”。

This有一些你可以获取的代码。

问候, =艾伦

关于c# - 在 C# 中使用 DataGridView 和 BindingList 时的线程安全建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525597/

相关文章:

python-3.x - 在 StreamHandler 的 logging.basicConfig 中设置的自定义格式

c# - 如何在检查单元格后停止 DataGridView 编辑?

c# - 如何删除DataGridView中特定链接单元格的下划线

Python 记录器在未捕获异常后停止记录

logging - 如何使用 Flyway gradle 插件配置 sql 日志记录?

c# - 在 DataGridView 中对日期进行排序

c# - Json 序列化更改日期时间

c# - 自定义 NLog 过滤器类的单元测试

c# - 根据 ASP.NET MVC 4 Internet 应用程序登录中的用户角色重定向到不同的页面

c# - NUnit DLL 版本不匹配