Click here to Skip to main content
13,897,867 members
Click here to Skip to main content
Add your own
alternative version

Tagged as


23 bookmarked
Posted 27 Oct 2011
Licenced CPOL

Concurrent Observable Collection

, 11 Apr 2012
Rate this:
Please Sign up or sign in to vote.
Using ObservableCollection in a multi-threaded environment.


There are plenty of custom implementations of thread safe observable collections. Some are more advanced than others but in most scenarios these are overkill. The overhead introduced by concurrency code in most cases is not necessary. I will demonstrate how the regular ObservableCollection could be used in a multithreaded environment without any need for creating a new type.


In order to use a collection in a thread safe manner, at the very least, there has to be an object which could be used to synchronize access to the collection. Most custom solutions subclass the ObservableCollection in order to associate a sync object with the collection but it is not necessary. ObservableCollection already has that object. It derives from the Collection class which implements the ICollection interface.

public interface ICollection : IEnumerable
    int Count { get; }
    bool IsSynchronized { get; }
    object SyncRoot { get; }
    void CopyTo(Array array, int index);

The SyncRoot property gives us exactly the object we need. Now synchronization of the collection is only a matter of properly applying locks only where and when it is required. There is no point in wasting any processing time where it is not needed.

Using the code

Using the collections in a thread safe manner is very simple. Just cast it into ICollection and lock on the SyncRoot property:

lock ((_collection as ICollection).SyncRoot)

SyncRoot provides a universal way of accessing the synchronization object of the collection. So if you subclass a collection and create your own type, you will still be able to access and use this object and work in concert with whatever synchronization the class provides.

Implementing Concurrency in a derived type

If you wish to implement a thread safe collection as a derived type, it is still beneficial to use the SyncRoot property. It gives you access to the same lock object inside and outside your class, and allows extra flexibility in handling non-trivial situations.

lock((this as ICollection).SyncRoot)
    T removedItem = this[oldIndex];
    base.InsertItem(newIndex, removedItem);

Because lock() internally uses Monitor, it is safe to call lock on the same thread recursively. This allows us to combine several operations under the same external lock:

lock ((_collection as ICollection).SyncRoot)
    T removedItem = _collection[Index];
    _collection.Insert(newIndex, removedItem);

When lock is applied to SyncRoot inside RemoveAt, Insert, etc., it will not block. It will increase the reference counter and continue with the operation. Once the operation is done, it will decrease the counter and release the lock once all of them are done.


  • 10/27/2011 - Released.
  • 04/11/2012 - Recategorized as Tip


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Eugene Sadovoi
Software Developer (Senior)
United States United States
Senior Software Engineer with over 20+ years of experience in variety of technologies, development tools and programming languages.

Microsoft Certified Specialist programming in C#, JavaScript, HTML, CSS

You may also be interested in...

Comments and Discussions

QuestionConcurrent Collections Pin
YandyZM31-Oct-11 11:21
memberYandyZM31-Oct-11 11:21 
AnswerRe: Concurrent Collections Pin
Eugene Sadovoi31-Oct-11 13:44
memberEugene Sadovoi31-Oct-11 13:44 
GeneralRe: Concurrent Collections Pin
YandyZM1-Nov-11 4:43
memberYandyZM1-Nov-11 4:43 
AnswerRe: Concurrent Collections Pin
Eugene Sadovoi8-Nov-11 3:43
memberEugene Sadovoi8-Nov-11 3:43 
GeneralMy vote of 4 Pin
SledgeHammer0128-Oct-11 7:49
memberSledgeHammer0128-Oct-11 7:49 
AnswerRe: My vote of 4 Pin
Eugene Sadovoi28-Oct-11 7:52
memberEugene Sadovoi28-Oct-11 7:52 
Questionuseful Pin
BillW3328-Oct-11 6:25
professionalBillW3328-Oct-11 6:25 
AnswerRe: useful Pin
Eugene Sadovoi28-Oct-11 7:24
memberEugene Sadovoi28-Oct-11 7:24 
GeneralEvents Pin
stooboo27-Oct-11 23:34
memberstooboo27-Oct-11 23:34 
GeneralRe: Events Pin
Eugene Sadovoi28-Oct-11 4:05
memberEugene Sadovoi28-Oct-11 4:05 
GeneralRe: Events Pin
stooboo28-Oct-11 7:39
memberstooboo28-Oct-11 7:39 
GeneralRe: Events Pin
Eugene Sadovoi28-Oct-11 7:49
memberEugene Sadovoi28-Oct-11 7:49 
QuestionSynchronization needs to be handled with care Pin
John Brett27-Oct-11 22:43
memberJohn Brett27-Oct-11 22:43 
AnswerRe: Synchronization needs to be handled with care Pin
Julien Villers27-Oct-11 23:09
professionalJulien Villers27-Oct-11 23:09 
AnswerRe: Synchronization needs to be handled with care Pin
Eugene Sadovoi28-Oct-11 4:29
memberEugene Sadovoi28-Oct-11 4:29 
QuestionThought Pin
cdkisa27-Oct-11 14:42
membercdkisa27-Oct-11 14:42 
AnswerRe: Thought Pin
Eugene Sadovoi28-Oct-11 7:36
memberEugene Sadovoi28-Oct-11 7:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web05 | 2.8.190306.1 | Last Updated 11 Apr 2012
Article Copyright 2011 by Eugene Sadovoi
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid