2013-02-11 6 views
6

Sto lavorando a un'applicazione Windows 8 utilizzando C#/XAML. Tutto ha funzionato, tranne questo gestore di eventi, dove ho ricevuto il seguente errore su questa riga.Applicazione Windows 8 L'applicazione ha chiamato un'interfaccia che è stata sottoposta a marshalling per un thread diverso

await RefreshUserInfoAsync();

L'applicazione chiamati un'interfaccia che è stato marshalling per un thread differente. (Eccezione da HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

Questa raccolta osservabile viene aggiornata da un gestore di notifiche push nella classe dell'app e questo gestore di eventi è nel mio modello di vista. Non sto usando alcun framework come MVVM Light. Ho esaminato alcuni degli altri post su questo e ho provato a creare il mio Dispatcher Helper, ma ho ricevuto un errore diverso in cui Window.Current.Dispatcher è nullo. Qualche idea su come farlo funzionare?

private async void PushActions_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     string action = e.NewItems[0] as string; 
     if(action != null) 
     { 
      await RefreshUserInfoAsync(); 
     } 
    } 


    private async Task RefreshUserInfoAsync() 
    { 
     var userInfos = await SessionRepository.GetSessionUsersWithInfoAsync(SessionGuid, RoundGuid); 
     this.UserInfoList = new ObservableCollection<UserInfo>(userInfos); 
    } 

sottolineato testo

risposta

18

Ho parlato con Jeffrey Richter e mi ha dato la risposta. Dal modello di vista, posso arrivare al Dispatcher tramite CoreApplication.MainView.CoreWindow.

Ecco l'aggiornamento:

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher; 

await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => { 
    this.UserInfoList = new ObservableCollection<UserInfo>(userInfos); 
}); 

Spero che questo aiuta a qualcun altro.

Mike

+0

Non funziona per me. VS non riconosce l'attesa per qualche motivo. Sto sviluppando per MS Surface con Windows 8 SDK. – Howie

+1

La firma del metodo ha asincrono? async pubblico Attività GetCustomersAsync(). Se lo fa, che struttura stai usando? 4.5? Se è in un PCL e hai scelto qualcosa di inferiore a Win8, potrebbe tornare a 4.0. Penso che ci sia un pacchetto nugget per aggiungere async/await alle librerie 4.0. – MikeDouglasDev

+0

Ha funzionato come un fascino, grazie mille! – cesarferreira

Problemi correlati