2013-02-11 28 views
6

我正在使用c#/ XAML的Windows 8應用程序。除了這個事件處理程序之外,所有東西都一直在工作,我在這一行中遇到以下錯誤。Windows 8應用程序稱爲接口的應用程序被編組爲不同的線程

await RefreshUserInfoAsync();

的應用程序調用這是編組爲一個不同的線程的接口。 (來自HRESULT的異常:0x8001010E(RPC_E_WRONG_THREAD))

此Observable集合正在從應用程序類中的推送通知處理程序進行更新,並且此事件處理程序位於我的視圖模型中。我沒有使用MVVM Light之類的框架。我查看了一些其他的帖子,並試圖創建我自己的Dispatcher Helper,但是我收到了一個不同的錯誤,其中Window.Current.Dispatcher爲null。任何想法如何使這項工作?

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); 
    } 

強調文本

回答

18

Jeffrey Richter交談,他給我的回答。從視圖模型中,我可以通過CoreApplication.MainView.CoreWindow進入Dispatcher。

這裏是更新:

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher; 

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

我希望這可以幫助別人。

Mike

+0

對我不起作用。 VS由於某種原因不能識別「await」。我正在開發用於Windows 8 SDK的MS Surface。 – Howie 2013-08-21 11:52:39

+1

你的方法簽名有異步嗎? 公共異步任務 GetCustomersAsync()。如果是這樣,你使用的是什麼框架? 4.5?如果它在PCL中,並且你選擇了低於Win8的東西,它可能會恢復到4.0。我認爲有一個nugget軟件包用於爲4.0庫添加異步/等待。 – MikeDouglasDev 2013-08-22 10:52:22

+0

像魅力一樣工作,非常感謝! – cesarferreira 2013-12-18 14:15:49

相關問題