Параллельные коллекции в C # - PullRequest
       30

Параллельные коллекции в C #

3 голосов
/ 02 сентября 2008

Я ищу способ получить параллельную коллекцию в 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);
        }
    }

Ответы [ 3 ]

5 голосов
/ 02 сентября 2008

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

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }
4 голосов
/ 02 сентября 2008

Так что я не совсем уверен, что вы спрашиваете, но команда Parallel Extensions собрала некоторые вещи, которые могли бы удовлетворить все требования. В частности, смотрите этот пост в блоге о перечислении параллельных коллекций . Он также содержит ссылку для загрузки Parallel CTP, и вы, конечно же, можете просмотреть остальные посты блога, чтобы получить представление о том, для чего предназначен CTP и как работает модель программирования.

1 голос
/ 02 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...