ConcurrentBag of strings and using .Contains in Parallel.ForEach

ConcurrentBag of strings and using .Contains in Parallel.ForEach

 
The collection is threadsafe, as in "using it concurrently won't corrupt its state". It doesn't make your "contains then add" operation atomic. It's your code that isn't threadsafe

 

ConcurrentBag is threadsafe, but your code isn't:

if (!SystemNames.Contains(name))
{
    SystemNames.Add(name);
}

Contains will execute in a thread-safe way, then Add will also execute in a thread-safe way, but you have no guarantee that an item haven't been added in-between.

For your needs, I recommend using a ConcurrentDictionary instead. Just ignore the value as you won't need it.

var SystemNames = new ConcurrentDictionary<string, bool>();

Then use the TryAdd method to do the "if not contains then add" in a single atomic operation:

SystemNames.TryAdd(name, true);
作者:Chuck Lu    GitHub    
posted @   ChuckLu  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2019-05-08 User control's property loses value after a postback
2019-05-08 share memory cache across multi web application
2019-05-08 Losing session data in ASP.NET
2019-05-08 What is the difference between UserControl, WebControl, RenderedControl and CompositeControl?
2019-05-08 如何查看自增长以及重置自增长
2019-05-08 如何查看red gate安装时的log
2018-05-08 第二章 在Html中使用JavaScript
点击右上角即可分享
微信分享提示