2012-03-20 88 views
0

我的應用程序有線程問題。關於集合的多線程問題

由於線程問題經常發生,它不會一直髮生。 對這個代碼有時發生collectionChanged異常:

SyncLock _padLock 
     System.Threading.Monitor.Enter(serie) 
     For Each dat In serie.Lignes 
      WriteLine(dat.Columns(), False, 0, False)'exception here 
     Next 
     System.Threading.Monitor.Exit(serie) 
    End SyncLock 

基本上是一個系列包含的行,這是對象的陣列。

爲什麼另一個線程能夠修改系列,如果我在該對象上有一個監視器鎖?

此外,我似乎無法看到部分被鎖定在VS.有沒有特定的方式?

編輯:

我修改了代碼,以便正確完成鎖定。該錯誤消失了。但現在我試圖找出另一個錯誤即時通訊。 這是一個非常棘手的問題,因爲有時我會得到意想不到的結果(高度歸因於種族),但是當我在代碼中有斷點時,我無法再現它。

這是一個非常多毛的情況。

+1

是否正在調試集合的代碼也是同步的? (例如,它是否使用相同的對象進行鎖定?) – 2012-03-20 11:41:13

+0

不,修改集合的代碼不是同步的。但是,如果我鎖定對象,只有一個線程應該被允許訪問它? – squelos 2012-03-20 12:54:58

+0

@squelos - 鎖不保護* object *,它會投影*代碼塊*。因此,您需要將每個可修改「serie」或「serie.Lignes」的代碼塊封裝在同一個對象*中。 – 2012-03-20 13:27:41

回答

0

你可以使用.Net 4.0嗎?
ConcurrentBag將是一個更好的類型來支持你的集合,所以這是線程安全的。
您目前鎖定了兩次(_padLock和serie),但這並不能保護您免受任何人在未鎖定的情況下修改集合。
另一種替代方法是創建集合的本地副本並圍繞此副本進行循環,但這並不能消除競爭。

+0

是的,我可以使用.net 4.0。我看看周圍。我真的不熟悉線程。 – squelos 2012-03-20 12:55:59