Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用DataGridView和BindingList时的线程安全建议#_C#_Logging_Datagridview_Thread Safety_Bindinglist - Fatal编程技术网

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

C# 在C中使用DataGridView和BindingList时的线程安全建议#,c#,logging,datagridview,thread-safety,bindinglist,C#,Logging,Datagridview,Thread Safety,Bindinglist,我正在写一个记录事件的类。我的LogClass是作为单例实现的,系统中的任何类都可以编写日志条目。这些条目存储在一个列表中,当缓冲区被填满时,它们会被转储到磁盘上 我使用DataGridView在执行期间显示LogClass的内容,因此我使用了BindingList,以便查看器能够自动更新 我想知道我的类有多线程安全。 每次我在列表中添加一个新条目时,以及在遍历列表以将其转储到磁盘时,我都使用“lock”。 除了DataGridView之外,这个类基本上是只写的,因为没有从日志中读取的选项,只有

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

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

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

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

我的Dump()代码是:

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

我以为BindingList没有实现更改通知。在这种情况下,我认为这不是线程安全的

解决方案可能是使用实现IBindingList的自定义集合,并在返回任何元素之前更改列表访问器以获取锁


我有一个带有更改通知的IBindingList的自定义实现,因此如果您愿意,我可以与您分享。(无论如何,我可能会写一篇关于代码项目的文章来描述该实现。)

这不是一个真正的问题,因为一旦绑定,您只能从Form.Invoke方法(继承自Control.Invoke)更改列表。如果您试图从另一个线程更改列表,.NET运行时将在您的w/出现异常时发出“无法从当前线程更改此列表”的声音

有一些代码你可以抓取

问候,, =艾伦

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