簡體   English   中英

C#中的並發集合

[英]Concurrent collections in C#

我正在尋找一種在C#中獲取並發集合的方法,或者至少是一個支持並發枚舉器的集合。 現在,當我迭代的集合發生變化時,我收到了InvalidOperationException

我可以深度復制收藏並使用私人副本,但我想知道是否有更好的方法

代碼片段:

foreach (String s in (List<String>) callingForm.Invoke(callingForm.delegateGetKillStrings))
{
    //do some jazz
}

--編輯--

我接受了答案,但也發現我需要確保寫入集合的代碼也需要嘗試獲取鎖。

private void addKillString(String s)
{
    lock (killStrings)
    {
        killStrings.Add(s);
    }
}

除了進行深度復制之外,您最好的選擇可能是鎖定集合:

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }

所以我不太確定你在問什么,但 Parallel Extensions 團隊已經把一些可能符合要求的東西放在一起。 請特別參閱這篇關於 枚舉並行集合的博客文章。 它還包含一個下載 Parallel CTP 的鏈接,您當然可以瀏覽其余的博客文章以了解 CTP 的用途以及編程模型的工作原理。

如果您想使用 FCL 集合,那么鎖定是支持來自可能重疊的多個線程的迭代/修改的唯一方法。

但是,請注意您用作鎖定對象的內容。 如果集合本身是使用它的類的私有成員,則使用 SyncRoot 只是一個好主意。 如果集合是受保護的或公共的,那么您的類的客戶端可以在您的 SyncRoot 上獲取自己的鎖,這可能會導致您的類中的代碼死鎖。

如果您有興趣查看 3rd-party collection library,我推薦優秀的C5 Generic Collection Library 他們有一系列基於樹的集合,可以在不鎖定的情況下輕松安全地同時修改和迭代 - 有關詳細信息,請參閱他們(優秀)文檔的第 8.10 和 9.11 節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM