2014-11-03 4 views
0

в применении Windows Phone в моем конструкторе ViewModel зарегистрироваться гонец, как это:исключения Thread при использовании сообщений

Messenger.Default.Register<MyType> 
(
    this, 
    (action) => ReceiveMessage(action) 
); 

Тогда в ReceiveMessage я пытаюсь поставить какой-то код, и он выходит из строя с

"The application called an interface that was marshalled for a different thread." 

private void ReceiveMessage(MyType action) 
{ 
    this.MyCollection.Clear(); 

    foreach (Student st in Students) 
    { 
     this.MyCollection.Add(st); 
    } 
} 

Я пытался делать это, и он приходит с тем же результатом:

Application.Current.Resources.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => this.MyCollection.Clear()); 

ответ

0

Вам необходимо поставить вызов Dispatcher.RunAsync() в вашем зарегистрированном обработчике, так что вызывается весь вызов ReceiveMessage(), а не только один оператор этого метода.

Messenger.Default.Register<MyType> 
(
    this, 
    (action) => Application.Current.Resources.Dispatcher.RunAsync(
     CoreDispatcherPriority.Normal,() => ReceiveMessage(action)) 
); 

Конечно, изменить метод ReceiveMessage() обратно к тому, как это было изначально (без диспетчерскому-ПРИВЛЕЧЕНИЕ).

Кроме того, я не уверен, что диспетчер из ресурсов является правильным; это, конечно, не то, как я это сделал в WinRT. Возможно, это телефонная вещь, но если выше все еще не работает, попробуйте вместо этого использовать Application.Current.Dispatcher.

+0

Это все еще дает мне это исключение от звонка .. –

+0

Что такое трассировка стека? Какой поток вы используете, когда вы вызываете метод «Register ()»? Вы попробовали 'Application.Current.Dispatcher'? Или это недоступно в классе «Приложение» для телефона? –

+0

Нет Диспетчера в текущем состоянии. Только в ресурсах .. –

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