当一个集合没有被修改但是被查询时锁定它

时间:2014-01-26 16:35:09

标签: c# multithreading locking thread-synchronization

private List<Client> _selectedClientList;
    ... ... ...
private void ExecuteRemove(Address address)
{
    List<Client> clientsPerCountry = _selectedClientList.Where(p => p.Address != null && p.Address.Country == address.Country).ToList();
    ... ... ...
}

我是线程同步的新手,所以不要粗暴对我说。 _selectedClientList是一个保存Client对象的私有字段。 ExecuteRemove查询_selectedClientList,根据其参数创建客户列表,但不会修改_selectedClientList。那么,当在多个线程上调用ExecuteRemove时,我是否需要锁定_selectedClientList

如果没有,那么完全不同的线程如何访问_selectedClientList。我的意思是,当一个线程正在执行查询而第二个线程尝试访问它时,究竟会发生什么?

1 个答案:

答案 0 :(得分:0)

是的,如果至少有一个线程修改它,你需要这样做!

我在List<T>的{​​{1}}上有一个heisenbug,这是由另一个修改列表的线程引起的。

在您以任何方式枚举,阅读或访问它时锁定它,而不仅仅是在foreach()Add()时。

如果不这样做,您将获得InvalidOperationException