2014-01-26 23 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

相關問題