Безопасность потока с помощью словаря
Если у меня есть
Dictionary<int, StreamReader> myDic = new Dictionary<int, StreamReader>
//Populate dictionary
Один поток делает
myDic[0] = new StreamReader(path);
Другой поток выполняет
myDic[1] = new StreamReader(otherpath)
Является ли этот поток безопасным, потому что фактический элемент в изменяющемся словаре отличается от того, который находится в другом потоке, или я получу InvalidOperationException: Collection was modified
Ответы
Ответ 1
Вы получите только InvalidOperationException: Collection was modified
, если перечислить словарь при изменении.
Однако это не является потокобезопасным.
Если одна из этих операций приводит к изменению размера словаря, другой может затеряться.
Вместо этого используйте ConcurrentDictionary
.
Ответ 2
Коллекции System.Collections.Generic являются только потокобезопасными, если вы читаете из нескольких потоков.
Цитата из MSDN
Класс System.Collections.Generic не обеспечивает синхронизацию потоков; код пользователя должен обеспечивать всю синхронизацию, когда элементы добавляются или удаляются одновременно с несколькими потоками
Если вы хотите, чтобы безопасность потоков для операций чтения и записи рассматривалась с использованием System.Collections.Concurrent
* Когда вы пишете новый код, используйте классы параллельной коллекции всякий раз, когда коллекция будет записывать несколько потоков одновременно. *
Ответ 3
Чтобы улучшить код, вы можете захотеть найти класс ConcurrentDictionary
. Он будет решать некоторые проблемы с многопоточными.