Вместо блокировки на контейнерах вы должны использовать ReaderWriterLockSlim. Это дает вам базу данных, как блокировку - бесконечное количество читателей, один писатель и возможность обновления.
Что касается шаблонов проектирования, pub / sub довольно хорошо развиты, и их очень легко писать в .NET (используя readerwriterlockslim). В нашем коде у нас есть объект MessageDispatcher, который каждый получает. Вы подписываетесь на него или отправляете сообщение совершенно асинхронно. Все, что вам нужно для блокировки - это зарегистрированные функции и любые ресурсы, с которыми они работают. Это делает многопоточность намного проще.