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
。我的意思是,当一个线程正在执行查询而第二个线程尝试访问它时,究竟会发生什么?
答案 0 :(得分:0)
是的,如果至少有一个线程修改它,你需要这样做!
我在List<T>
的{{1}}上有一个heisenbug,这是由另一个修改列表的线程引起的。
在您以任何方式枚举,阅读或访问它时锁定它,而不仅仅是在foreach()
或Add()
时。
如果不这样做,您将获得InvalidOperationException。