public void PublishDataForKey(string key, object data) { if (_handlers.ContainsKey(key)) { IList <DataHandler> handlers = null; using (_handlers.GetWriteLock()) { handlers = new List <DataHandler>(_handlers[key]); //Copy _handlers[key].Clear(); } //Call ThreadPool.QueueUserWorkItem(x => { foreach (var handler in handlers) { handler.OnDataAvailible(data); } handlers.Clear(); }); } }