与DataGridView的数据源进行线程安全交互

时间:2014-01-09 09:51:31

标签: c# collections datagridview concurrency synchronization

假设DataGridView将DataSource作为BindingList。某些后台线程可能都会从此列表中读取和写入。显然,如果DataGridView在后台线程枚举时修改了列表,则会出现问题(InvalidOperationException:collection已被修改)。 我能想到3个解决方案:

  1. 同步对列表的访问
  2. 使用.Invoke()获取列表的副本并枚举该列表。枚举后,使用另一个.Invoke()将数据源替换为(可能)修改后的集合
  3. 使用线程安全集合作为数据源。
  4. 我认为2.导致过多的开销,并且没有一个可用的踏板安全集合像List / BindingList一样灵活。因此我倾向于方法1.如果我将所有列表访问放在lock (list.SyncRoot) { ... }块中,那么它可以工作,但是我需要说服DataGridView也这样做。这可能吗?

0 个答案:

没有答案