2008-09-02 3 views
3

Я ищу способ получения параллельной коллекции на C# или, по крайней мере, коллекции, которая поддерживает параллельный перечислитель. Прямо сейчас я получаю InvalidOperationException, когда коллекция, над которой я выполняю изменения. Я мог бы просто глубоко скопировать коллекцию и работать с собственной копией, но мне интересно, если есть, возможно, лучший способПараллельные коллекции в C#

Фрагмент кода:

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

--edit--

Я взял ответ, но также обнаружил, что мне нужно было убедиться, что код, который писал в сборнике, должен был попытаться получить блокировку.

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

ответ

5

Другие, чем делать глубоко скопировать ваш лучший выбор может быть, чтобы заблокировать коллекцию:

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

Так что я не совсем уверен, что вы просите, но команда Parallel Extensions имеет собрал кое-что, что могло бы подставить счет. См. Этот блог, в частности, около enumerating parallel collections. Он также содержит ссылку для загрузки Parallel CTP, и вы можете, конечно, просматривать остальные записи в блоге, чтобы получить представление о том, что означает CTP и как работает модель программирования.

1

Если вы хотите использовать коллекции FCL, то блокировка является единственным способом поддержки итерации/модификации из нескольких потоков, которые могут перекрываться.

Будьте осторожны, что вы используете в качестве объекта блокировки. Использование SyncRoot - это только хорошая идея, если сама коллекция является частным членом класса, который ее использует. Если коллекция защищена или общедоступна, клиент вашего класса может самостоятельно заблокировать ваш SyncRoot, что может привести к блокировке кода в вашем классе.

Если вы заинтересованы в том, чтобы взглянуть на стороннюю коллекционную библиотеку, я рекомендую отличные C5 Generic Collection Library. У них есть семейство коллекций на основе дерева, которые можно легко и безопасно модифицировать и повторять в одно и то же время без блокировки - подробности см. В разделах 8.10 и 9.11 их (отличной) документации.