How does SynchronizedCollection<T>
and the concurrent collections in the System.Collections.Concurrent
namespace differ from each other, apart from Concurrent Collections being a namespace and SynchronizedCollection<T>
being a class?
SynchronizedCollection<T>
and all of the classes in Concurrent Collections provide thread-safe collections. How do I decide when to use one over the other, and why?
The
SynchronizedCollection<T>
class was introduced first in .NET 2.0 to provide a thread-safe collection class. It does this via locking so that you essentially have aList<T>
where every access is wrapped in alock
statement.The
System.Collections.Concurrent
namespace is much newer. It wasn't introduced until .NET 4.0 and it includes a substantially improved and more diverse set of choices. These classes no longer use locks to provide thread safety, which means they should scale better in a situation where multiple threads are accessing their data simultaneously. However, a class implementing theIList<T>
interface is notably absent among these options.So, if you're targeting version 4.0 of the .NET Framework, you should use one of the collections provided by the
System.Collections.Concurrent
namespace whenever possible. Just as with choosing between the various types of collections provided in theSystem.Collections.Generic
namespace, you'll need to choose the one whose features and characteristics best fit your specific needs.If you're targeting an older version of the .NET Framework or need a collection class that implements the
IList<T>
interface, you'll have to opt for theSynchronizedCollection<T>
class.This article on MSDN is also worth a read: When to Use a Thread-Safe Collection