Потокобезопасная замена ObservableCollection <T>в C # 4.0 с безопасным перечислением - PullRequest
1 голос
/ 10 ноября 2010

У меня есть ObservableCollection<T> в одном из моих проектов, и мне нужно сделать доступ потокобезопасным.
В частности, мне нужен потоковый перечислитель. Это означает, что во время итерации по коллекции (например, во время запроса LINQ) никто не сможет добавить элемент.

Я заметил классы в пространстве имен .NET 4.0 System.Collections.Concurrent. Однако ни один из них, кажется, не подходит. Кроме того, в документе MSDN я не нашел параграфа, по которому доступ на самом деле поточно-ориентирован.

Есть ли где-нибудь существующая потокобезопасная коллекция, которую я могу использовать, или я должен реализовать это сам?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2010

Имейте в виду, что если вы снимаете блокировку в методе GetEnumerator, вы можете удерживать блокировку очень долгое время, в течение которого никто не сможет добавить объекты в вашу коллекцию:

foreach (var o in myCollection) {
    // Do something that takes 10 minutes
}

Вам также нужно подумать о том, что произойдет, если несколько итераций происходят одновременно. Это означает что-то вроде блокировки MRSW (несколько писателей, один писатель), который вам, возможно, придется реализовать самостоятельно.

Похоже, что вам действительно нужно сделать, это перебрать снимок коллекции:

foreach (var o in myCollection.ToArray()) {
    // ...
}

Чтобы сделать это правильно, вам нужно реализовать свой собственный ICollection<T>, который снимает блокировку в ToArray и Add методах

Это может помочь, если вы дадите свои требования или спецификации более точно.

0 голосов
/ 10 ноября 2010

ObservableCollection не является потокобезопасным. Реализуйте над ним свою собственную многопоточную оболочку.

...