Что преимуществом использования является ConcurrentBag (MyType) против просто использования Списка (MyType)? Страница MSDN на CB указывает это
ConcurrentBag (T) является ориентированной на многопотоковое исполнение реализацией сумки, оптимизированной для сценариев, где тот же поток будет и производить и использовать данные, хранившие в сумке
Таким образом, каково преимущество? Я могу понять преимущество других типов набора в пространстве имен Параллелизма, но этот озадачил меня.
Внутри ConcurrentBag реализован с использованием нескольких разных списков, по одному для каждого потока записи.
Это утверждение, которое вы процитировали, означает, что при чтении из пакета он будет отдавать приоритет списку, созданному для этого потока. Это означает, что он сначала проверит список для этого потока, прежде чем рисковать конкуренцией в списке другого потока.
Таким образом можно свести к минимуму конфликт блокировок, когда несколько потоков одновременно читают и пишут. Когда у читающего потока нет списка или его список пуст, он должен заблокировать список, назначенный другому потоку. Но если у вас есть несколько потоков, все из которых читают и записывают в свой собственный список, то у вас никогда не будет конкуренции за блокировку.
В отличие от других параллельных коллекций, ConcurrentBag
оптимизирован для однопоточного использования.
В отличие от List
, ConcurrentBag
можно использовать из нескольких потоков одновременно.
Я думаю, вы должны прочитать это как «когда несколько потоков обращаются к контейнеру, и каждый поток может как производить, так и / или потреблять данные», это определенно предназначено для параллельных сценариев. .
Самым большим преимуществом здесь является то, что ConcurrentBag
безопасен для доступа из нескольких потоков, а LisT
- нет. Если для вашего сценария важен потокобезопасный доступ, то тип вроде ConcurrentBag
, возможно, будет вашим преимуществом перед List
+ ручная блокировка. Нам нужно узнать немного больше о вашем сценарии, прежде чем мы действительно сможем ответить на этот вопрос.
Кроме того, List
является упорядоченной коллекцией, а ConcurrentBag
- нет.