Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как синхронизировать List? 
:(
    Опции темы
Stas123
Дата 4.8.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Является ли мои класс потокобезопасным?
Как пергерузить List<T>.Item - свойство  ,чтобы сделать его потокобезопасным?
Код

[Synchronization]
    public class MySynchronizedList : List<T>
    {
        public MySynchronizedList()
            : base()
        {
            
        }
        
        public new void AddRange(IEnumerable<T> collection)
        {
            base.AddRange(collection);
        }    
    }


Это сообщение отредактировал(а) Stas123 - 4.8.2011, 15:44
PM MAIL   Вверх
jonie
Дата 4.8.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



для написания Synchronized используйте паттерн Декоратор (ака Wrapper) - то есть берете и наследуете свой класс от того, от чего наследуется List<T>, внутри него объявляете private List<T> с которым и взаимодействуете через реализуемые методы, внутри которых делаете lock-и какие надо (не везде нужен например lock - гдето можно обойтись ReadWriteLock-ом и т.д.)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
HalkaR
Дата 4.8.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 14
Всего: 42



По идее начиная с .Net 3.0 есть стандартная коллекция SynchronizedCollection. Она реализует IList<T>. Но перечисление этой коллекции все равно не thread safe. Уж не знаю почему они так сделали. К счатью эта коллекция выставляет наружу SyncRoot так что можно сделать безопасное перечисление.

Для примера можно посмотреть здесь - http://www.koders.com/csharp/fidEC9729DF37...172CED0918.aspx

Добавлено через 2 минуты и 42 секунды
Кстати jonie прав - если сделаете на ReaderWriterLockSlim - будет эффективнее, а переделка не сложная.
PM MAIL   Вверх
jonie
Дата 4.8.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(HalkaR @  4.8.2011,  17:06 Найти цитируемый пост)
Но перечисление этой коллекции все равно не thread safe.

а как ты себе это представляешь должно быть сделано?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
HalkaR
Дата 5.8.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 14
Всего: 42



Цитата(jonie @ 4.8.2011,  16:45)
Цитата(HalkaR @  4.8.2011,  17:06 Найти цитируемый пост)
Но перечисление этой коллекции все равно не thread safe.

а как ты себе это представляешь должно быть сделано?

Копированием всех элементов во временное хранилище.
PM MAIL   Вверх
jonie
Дата 5.8.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(HalkaR @  5.8.2011,  14:55 Найти цитируемый пост)

Копированием всех элементов во временное хранилище. 

ну так это очень очень непросто. Копировать как ? Глубокое копирование? А если не поддерживается IClonable? И т.д. В общем я думаю понятно почему в стандартной версии это не потокобезопасно.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.