我分拆一個新的線程,從數據庫中讀取數據。每X記錄一個標誌被髮信號通知主線程將在那裏處理已被檢索的記錄並保留一些並丟棄其他記錄。當標誌被髮信號時,我使用鎖來允許讀者線程等待處理器線程完成處理記錄。然而,看起來鎖沒有這樣做,因爲當我遍歷記錄時,更多的不斷增加(表明讀者線程仍在讀取)。這會導致集合被修改,導致InvalidOperationExecption。C#鎖定不允許關鍵代碼運行正常
也許我誤會了的「鎖定」的宗旨是或者我沒有正確使用它。下面是我有什麼僞:
readonly object locker = new object();
Dictionary screened = new Dictionary;
Search(){
Thread reader = new Thread(() => Read("search terms"));
reader.Start();
while(found < desiredAmount){
if(SIGNAL){
lock(locker){
ProcessRecords();
}
}
}
}
Read(){
Connect to DB
while(reader.Read()){
screened.add(record);
}
}
ProcessRecords(){
foreach(var x in screened){
//process record
}
}
我希望僞是不夠好,從我的理解閱讀()不應該在鎖塊執行一段時間。請幫我理解鎖好一點。
PS是的,我已經閱讀鎖MSDNs文章,還是不太懂如何在更復雜的情況下使用鎖。
「更好」在那裏有點規範。我喜歡我的鎖控制精細,以避免瓶頸;還有一些同步對象不支持'遞歸鎖定'(reentrancy)。我相信在.NET中,只有新的ReaderWriterLock具有該屬性 – sehe
我在發佈sehes回答的評論之後閱讀了此權限。這似乎現在正在工作。 – spots