You can use ViewModel from any stream, including reading and writing. The only exception is data collection — data bindings must be written to the user interface stream, since the binding does not automatically marshal in the user interface stream (for example, simple bindings).
However, you should still have the correct sync for any record. Problems with synchronizing normal threads will occur, since ViewModel is another class.
As the saying goes, usually you will have to handle synchronization in a slightly different way than in many cases. Locks usually do not work in ViewModel, since WPF data binding will not block objects. Therefore, you should usually use Dispatcher.Invoke / BeginInvoke to redirect calls back to the user interface stream if necessary when synchronization is required in the ViewModel.
source share