Is it correct ok to use ConcurrentBag<T> as object of ConcurrentDictionary<key, object>

c#, multithreading

Solution

Your assumptions that the `ConcurrentBag` is thread safe and the `List` is not are correct. But, you can synchronise access to the list, for example:

private static ConcurrentDictionary< string, SomeItemsBag > _SomeItemsBag;
private static ConcurrentDictionary< string, SomeItemsList > _SomeItemsList;
private static object _someItemsListLocker = new object();

private static void GetItem(string key)
{
    var bag = _SomeItemsBag[key];
    lock (_someItemsListLocker) {
        var list = _SomeItemsList[key];
    }
}

However, you're better off describing the situation completely if you want more holistic advice as to what data structure you should be using. Note that there are also `ConcurrentQueue` and `ConcurrentStack` which may be better for what you want over the list. They are optimised in multi-threaded scenarios since addition and removal can only happen on one side respectively (same sides for stack, opposite sides for queue).

Problem

In the following code: ``` public class SomeItem { } public class SomeItemsBag : ConcurrentBag< SomeItem > { } public class SomeItemsList : List< SomeItem > { } public static class Program { private static ConcurrentDictionary< string, SomeItemsBag > _SomeItemsBag; private static ConcurrentDictionary< string, SomeItemsList > _SomeItemsList; private static void GetItem(string key) { var bag = _SomeItemsBag[key]; var list= _SomeItemsList[key]; ... } } ``` My assumption is that bag is threadsafe and list is not. Is this the right way to deal with a dictionary of lists in a multithreaded app? Edited to add: Only 1 thread would be adding to the bag/list and another thread would remove, but many threads could access.

Original source