Извините, но я не согласен с Крисом Шмичем.
Вы можете видеть, что VerifyCalledOnUIThread()
появляется в DataModel
. На самом деле цель - Для проверки DataModel (не элемента управления), доступ к которому возможен только из потока пользовательского интерфейса . Да, пользовательский интерфейс WPF / SilverLight не защищен от многопотоковых операций, но в данном случае это не было реальной причиной.
Дело в том, что если вы связываете что-то (datamodel / viewmodel) с пользовательским интерфейсом WPF / SilverLight и получаете доступ к нему из другого потока, отличного от потока пользовательского интерфейса, то вы получите неинформативное исключение. Устранение неполадок, связанных с этой ошибкой, очень сложно, потому что исключение не дает никакой подсказки.
Я приведу вам пример об этом:
//pass model to datacontex and bind it
mycontrol.DataContext = myModel;
//myThreadedService is an assynchronous service
//done ini different thread.
//so ServiceDone will call myModel.Complete from different thread
//system will crash unexpectedly without enough clue
myThreadedService.ServiceDone += (s, e) => { myModel.Complete = true; }
myThreadedService.CallService();
Итак, я думаю, вы теперь понимаете, почему этот кусок кода должен быть там:
Debug.Assert(Dispatcher.CurrentDispatcher == this.Dispatcher,
"Call must be made on UI thread.");
Этот код даст подсказку, когда вы обращаетесь к DataModel из другого потока.