2012-07-25 36 views
2

我需要從(後臺)線程列表中讀取,而它可能會從另一個(主線程)更新。所以我試圖做一個臨時列表不要訪問原始對象。由於更新可能發生在多個地方,因此將SyncLock放置在讀取邏輯上會很方便。這本質上是錯誤的嗎?我正確鎖定這個選項的方法有哪些,或者其他方式在多線程條件下獲取列表的可訪問副本?多線程列表中的SyncLock仍然拋出ArgumentException

' In Main thread: 
Public SomeList = New List(Of SomeClass) 
' ..edit list 


' In other thread: 
    Dim tempList As List(Of SomeClass) 
    SyncLock SomeList 
     tempList = SomeList.ToList 
    End SyncLock 

SomeList.ToList拋出:

ArgumentException的,目的地陣列不夠長。檢查 destIndex和長度以及數組的下限。

回答

1

審查.ToList,因此New List(Of SomeClass)(.),在反射後,異常必須從is2.CopyTo(Me._items, 0)現身其中Me._items剛剛被設置爲New T(count - 1) {}

這意味着在檢索到is2.Count之後,輸入集合中的項目數(投到ICollection(Of T),is2)必須增加。

因此,我在我現在刪除的答案中重新提出了這個假設:在修改列表時,是否在主線程中的所有位置在' ..edit list中也使用SyncLock SomeList

+1

你說的沒錯,我在提問這個問題時沒有正確地使用過SynckLock,所以現在清楚了,這個列表已經被其他線程修改了,沒有鎖,就像你說的那樣。感謝更新! – bretddog 2012-07-28 20:37:39

0

不知道VB中的等價物是什麼,但難道你不能這樣做嗎?

IList<string> roDinosaurs = dinosaurs.AsReadOnly(); 

或者

tempList.AddRange(SomeList); 
+0

謝謝!至少到目前爲止,也許這是有效的,但是我也希望瞭解爲什麼我使用synclock有問題。 – bretddog 2012-07-25 10:31:24

+0

@bretddog我不相信它是。它的方法是拋出錯誤而不是SyncLock,我不認爲它們是相關的。 (它肯定不會與C#和鎖定)。 – 2012-07-25 10:43:20