Night Walker
Night Walker

Reputation: 21270

iterating through ConcurrentDictionary and modifying the collection

What is the correct way to iterate through ConcurrentDictionary collection and deleting some entries.

As I understand ConcurrentDictionary implements locking on a level of a cell, and for me is important to iterate through whole collection and remove irrelevant data via some condition. I affraid that through my iteration other thread will add data that should be filtered after my iterator was after that point in the collection.

So how I can achieve this with ConcurrentDictionary ,or should use ordinary Dictionary with locking mechanism on each touch of that collection.

Thanks.

Upvotes: 2

Views: 2101

Answers (2)

Peter Wishart
Peter Wishart

Reputation: 12280

ConcurrentDictionary's main advantage IMO is that it's lock free for the reading threads, which is usually why you'd use it; if you don't need that advantage then you can just use a dictionary with a lock.

You could always ensure the filter criteria are passed to any adds that occur after your filter iteration starts.

Otherwise, if non-blocking reads are more important than the occasional inconsistent entry, you could just repeat your filter until it finds no more invalid items.

Upvotes: 1

alpinsky
alpinsky

Reputation: 524

Definetely you can't garante, that no entries will be added to ConcurrentDictionary while you iterate it without locking the dictionary. But if do locking, then there no sence in using ConcurrentDictionary, use Dictionary instead.

Btw, why it is important for you to end iteration with no 'bad' entries left? It can be populated with any of them the next moment after releasing the lock. Maybe it's better to not let unwanted entries to appear in dictionary?

Upvotes: 0

Related Questions