Подтвердить что ты не робот

Безопасность потока с помощью словаря

Если у меня есть

Dictionary<int, StreamReader> myDic = new Dictionary<int, StreamReader>
//Populate dictionary

Один поток делает

myDic[0] = new StreamReader(path);

Другой поток выполняет

myDic[1] = new StreamReader(otherpath)

Является ли этот поток безопасным, потому что фактический элемент в изменяющемся словаре отличается от того, который находится в другом потоке, или я получу InvalidOperationException: Collection was modified

4b9b3361

Ответ 1

Вы получите только InvalidOperationException: Collection was modified, если перечислить словарь при изменении.

Однако это не является потокобезопасным.
Если одна из этих операций приводит к изменению размера словаря, другой может затеряться.
Вместо этого используйте ConcurrentDictionary.

Ответ 2

Коллекции System.Collections.Generic являются только потокобезопасными, если вы читаете из нескольких потоков.

Цитата из MSDN

Класс System.Collections.Generic не обеспечивает синхронизацию потоков; код пользователя должен обеспечивать всю синхронизацию, когда элементы добавляются или удаляются одновременно с несколькими потоками

Если вы хотите, чтобы безопасность потоков для операций чтения и записи рассматривалась с использованием System.Collections.Concurrent

* Когда вы пишете новый код, используйте классы параллельной коллекции всякий раз, когда коллекция будет записывать несколько потоков одновременно. *

Ответ 3

Чтобы улучшить код, вы можете захотеть найти класс ConcurrentDictionary. Он будет решать некоторые проблемы с многопоточными.