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: