¿Cuál es la mejor manera de implementar un Diccionario seguro para subprocesos?

Pude implementar un Diccionario seguro para subprocesos en C # derivando de IDictionary y definiendo un objeto SyncRoot privado:

public class SafeDictionary<TKey, TValue>: IDictionary<TKey, TValue>
{
    private readonly object syncRoot = new object();
    private Dictionary<TKey, TValue> d = new Dictionary<TKey, TValue>();

    public object SyncRoot
    {
        get { return syncRoot; }
    } 

    public void Add(TKey key, TValue value)
    {
        lock (syncRoot)
        {
            d.Add(key, value);
        }
    }

    // more IDictionary members...
}

Luego bloqueo este objeto SyncRoot en mis consumidores (varios subprocesos):

Ejemplo:

lock (m_MySharedDictionary.SyncRoot)
{
    m_MySharedDictionary.Add(...);
}

Pude hacerlo funcionar, pero esto resultó en un código feo. Mi pregunta es, ¿existe una forma mejor y más elegante de implementar un Diccionario seguro para subprocesos?

Respuestas a la pregunta(8)

Su respuesta a la pregunta