Потокобезопасный массив - PullRequest
2 голосов
/ 23 мая 2011

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

приватная строка только для чтения [] _foo = Enumerable.Range (1, 1000) .Select (i => i.ToString ()). ToArray ();

Какие есть варианты, чтобы сделать эту тему безопасной?

Ответы [ 3 ]

1 голос
/ 23 мая 2011

Если вы используете C # 4, вы можете использовать некоторые уже встроенные коллекции.Они работают быстрее, чем любая блокирующая коллекция, поскольку полагаются на стратегии без блокировок.

Взгляните на Concurrent Collections

1 голос
/ 23 мая 2011

Код, который инициализирует массив, в порядке. Вы помечаете массив как readonly, что означает, что невозможно присвоить новый массив полю _foo - но ваш код все еще может изменять элементы массива. Сама операция не вызовет сбой, но если массив будет изменен из нескольких потоков, вы можете получить неожиданные результаты.

Без дополнительной информации трудно сказать, в чем проблема. Каким образом происходит сбой вашего приложения?

0 голосов
/ 24 мая 2011
  • List<T> или T[] -> SynchronizedCollection<T> (учтите, что перечисление не является потокобезопасным)
  • Dictionary<T> -> ConcurrentDictionary<T>
  • Queue<T> -> ConcurrentQueue<T>
  • Stack<T> -> ConcurrentStack<T>
  • также рассмотрим BlockingCollection<T> для сценариев «производитель-потребитель»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...