2010-10-22 1 views
1

Я создал модель просмотра в Silverlight. Этот вид Модель имеет событие, определенное как:Поднять событие с помощью SynchronizationContext в Silverlight

public event EventHandler Data_Loaded; 

Я хочу «поднять» это событие, когда данные вызова службы завершены. Это позволит моему интерфейсу правильно реагировать. Обратите внимание, что это не просто простой сценарий привязки, поэтому я хочу это событие.

Сервисный вызов выполняется через HttpWebRequest. Как только этот запрос будет выполнен, я правильно разбираю результаты. Я пытаюсь, чтобы пользовательский интерфейс знал, что я закончил, но изначально я получал сообщение об ошибке «Недопустимый сквозной доступ». Я поговорил с сотрудником, который сказал мне, что я должен использовать SynchronizationContext.Current для создания события. К сожалению, я не понимаю, как это сделать. Может кто-нибудь, пожалуйста, объясните мне это?

ответ

2

Чтобы заставить событие подняться на потоке пользовательского интерфейса, необходимо использовать Dispatcher.

Deployment.Current.Dispatcher.BeginInvoke(() => DataLoaded(this,EventArgs.Empty)); 
+0

Я не поднимаю событие в пользовательском интерфейсе. Пользовательский интерфейс подписывается на событие в ViewModel. Если я использую диспетчер, кажется, что пользовательский интерфейс слишком тесно связан с ViewModel. Я ошибаюсь? – user462166

+0

Ключом к проблеме является то, что ваш пользовательский интерфейс прослушивает это событие, событие должно быть выбрано из потока пользовательского интерфейса. Хотя это возможно сделать с SyncronizationContext, это может быть настоящей болью, потому что SyncronizationContext.Current будет null, если вы не используете нить пользовательского интерфейса. Это означает, что вам нужно получить SyncronizationContext в потоке пользовательского интерфейса и сохранить его где-нибудь. Затем вы можете использовать это, чтобы перенаправить вызов обратно в нужный поток. В общем, в Silverlight я бы не стал считать его тесно связанным, если вы используете Deployment, а не App.RootVisual для доступа к диспетчеру. – Stephan

Смежные вопросы