I have a Silverlight app where I’ve implemented the M-V-VM pattern so my actual UI elements (Views) are separated from the data (Models). Anyways, at one point after the user has gone and done some selections and possible other input, I’d like to asyncronously go though the model and scan it and compile a list of optiions that the user has changed (different from the default), and eventually update that on the UI as a summary, but that would be a final step.
My question is that if I use a background worker to do this, up until I actually want to do the UI updates, I just want to read current values in one of my models, I don’t have to synchronize access to the model right? I’m not modifying data just reading current values…
There are Lists (ObservableCollections), so I will have to call methods of those collections like “_ABCCollection.GetSelectedItems()” but again I’m just reading, I’m not making changes. Since they are not primitives, will I have to synchronize access to them for just reads, or does that not matter?
I assume I’ll have to sychronize my final step as it will cause PropertyChanged events to fire and eventually the Views will request the new data through the bindings…
Thanks in advance for any and all advice.
You are correct. You can read from your Model objects and ObservableCollections on a worker thread without having a cross-thread violation. Getting or setting the value of a property on a UI element (more specifically, an object that derives from DispatcherObject) must be done on the UI thread (more specifically, the thread on which the DispatcherObject subclass instance was created). For more info about this, see here.