C# 与DataGridView的线程安全交互';s数据源

C# 与DataGridView的线程安全交互';s数据源,c#,collections,datagridview,concurrency,synchronization,C#,Collections,Datagridview,Concurrency,Synchronization,假设DataGridView有一个BindingList作为数据源。一些后台线程可以从该列表中读取和写入。显然,如果DataGridView在后台线程对列表进行枚举时修改列表(InvalidOperationException:collection已修改),则这是有问题的。 我可以想出3种解决方案: 同步对列表的访问 使用.Invoke()获取列表的副本并对其进行枚举。枚举后,使用另一个.Invoke()将数据源替换为(可能)已修改的集合 将线程安全集合用作数据源 我想是2。导致过多的开销,并且

假设DataGridView有一个BindingList作为数据源。一些后台线程可以从该列表中读取和写入。显然,如果DataGridView在后台线程对列表进行枚举时修改列表(InvalidOperationException:collection已修改),则这是有问题的。 我可以想出3种解决方案:

  • 同步对列表的访问
  • 使用.Invoke()获取列表的副本并对其进行枚举。枚举后,使用另一个.Invoke()将数据源替换为(可能)已修改的集合
  • 将线程安全集合用作数据源
  • 我想是2。导致过多的开销,并且所有可用的安全集合都不如List/BindingList灵活。因此,我的首选方法是方法1.,如果我将所有列表访问放在
    锁(list.SyncRoot){…}
    块中,这可能会起作用,但是我需要说服DataGridView也这样做。这可能吗