2014-01-26 30 views
0
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是一个保存客户端对象的私有字段。 ExecuteRemove查询_selectedClientList,根据它的参数创建客户端列表,但不修改_selectedClientList。所以,当ExecuteRemove被多线程调用时,我是否需要锁定_selectedClientList锁定集合时,它不会被修改,但查询

如果不是,不同线程如何访问_selectedClientList。我的意思是,当一个线程执行查询并且第二个线程尝试访问它时,究竟发生了什么?

+0

如果我有任何帮助,你能接受吗? – pid

回答

0

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

我在foreach()List<T>上有一个heisenbug,这是由另一个线程修改列表引起的。

每当您枚举,读取或以任何方式访问它时都会锁定它,而不仅仅是当您使用Add()Clear()时。

如果您不知道,您将得到InvalidOperationException

+0

没有线程正在修改集合,他们只访问它来枚举。 – atiyar

+0

如果你确定这一点,你不需要任何锁定。要有任何形式的并发,数据必须被修改。在不变数据(常量)上不会发生并发。 – pid

+0

实际并发发生在'ExecuteRemove'的正文后面。但我担心这个问题的界限。 – atiyar