WPF have the concept of the UI thread and background (or secondary) threads. Code on a background thread is not allowed to interact with UI elements (controls, etc.) on the foreground thread. What happens when you need to add and remove items from a collection from that background thread? That’s pretty common in applications which must keep a list updated . When the collection raises the change notification events, the binding system and listeners, on the UI thread, have code executed.
Before WPF 4.5 we have to use dispatcher to enable this feature in observable collection or we end up creating thread safe observable collection and also expose Add Range function which is not available in observable collections.
WPF 4.5 includes a number of key targeted performance and capability features, one of which is cross-thread collection change notification. Enabling the change notification is as simple as the inclusion of a lock object and a single function call. Versus the manual dispatching approach, this can be a real performance win, not to mention save you some coding time.
Use BindingOperations.EnableCollectionSynchronization to enable this cross thread access of observable collections.
So inside your view model you call this method and provide the lock to synchronise the collection from multiple threads. BindingOperations.EnableCollectionSynchronization, the WPF data binding engine participates in locking. The default behavior is to acquire a lock on the object specified in the aforementioned call, but you also have the option to use more complex locking schemes.
something like
BindingOperations.EnableCollectionSynchronization(this.items, itemsSyncLock);
where
private readonly object itemsSyncLock = new object();
private readonly ObservableCollection<string> items = new ObservableCollection<string>();
Now when you have to add data into collection from background thread
simply lock the collection and update it
lock (itemsSyncLock)
{
// Once locked, you can manipulate the collection safely from another thread
items.Add(value);
}
This means now you don’t need IDispatcher in you application anymore..
There are also other binding properties like IsAsync (to get the data asynchronously) , Delay (provides delay before committing binding values etc)..