#c# #arrays #multithreading #thread-safety
#c# #массивы #многопоточность #потокобезопасность
Вопрос:
Я ужасен в многопоточности, но с тех пор, как я добавил следующую строку в свое приложение, кажется, что она довольно часто выходит из строя, поэтому я предполагаю, что она не потокобезопасна.
частная строка, доступная только для чтения[] _foo = Перечислимая.Диапазон (1, 1000).Выберите(i => i.toString()).toArray();
Какие у меня есть варианты сделать этот потокобезопасным?
Комментарии:
1. В этой строке кода нет ничего правильного или неправильный. Вам нужно показать нам, как вы используете массив foo, вероятно, в этом и заключается проблема.
2. Извините за столь ограниченную информацию, я постараюсь раздобыть вам, ребята, еще немного, когда у меня будет немного времени. Еще раз спасибо за вашу помощь.
Ответ №1:
Код, который инициализирует массив, в порядке. Вы помечаете массив как readonly
, что означает, что _foo
полю невозможно назначить новый массив, но ваш код все еще может изменять элементы массива. Сама операция не вызовет сбоя, но если массив изменяется из нескольких потоков, вы можете получить неожиданные результаты.
Без дополнительной информации трудно сказать, в чем проблема. Каким образом происходит сбой вашего приложения?
Ответ №2:
Если вы используете C # 4, вы можете использовать некоторые уже встроенные коллекции. Они быстрее, чем любая блокирующая коллекция, поскольку они основаны на стратегиях без блокировок.
Взгляните на параллельные коллекции
Ответ №3:
List<T>
илиT[]
—>SynchronizedCollection<T>
(имейте в виду, что перечисление не является потокобезопасным)Dictionary<T>
—>ConcurrentDictionary<T>
Queue<T>
—>ConcurrentQueue<T>
Stack<T>
—>ConcurrentStack<T>
- также рассмотрите
BlockingCollection<T>
сценарии производитель-потребитель