2017-06-09 218 views
0

設置一個ViewModel UI屬性我想設置從一個異步方法的視圖模型列表屬性,但具有下列錯誤此結束:從異步方法

{"The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))"}

錯誤是相當清楚的。我不明白的是解決此問題的最佳方法,併成功設置屬性,然後更新UI。

private async Task DoSomething() 
    { 
     DispatcherHelper.Initialize(); 
     DispatcherHelper.CheckBeginInvokeOnUI(
     () => 
      { 
      ViewModelProperty = SomeResult; 
      }); 
    } 

什麼是解決這個問題的最好辦法:

下嘗試與初始化調度點對象引用不設置到對象錯誤的一個實例結束?

更新

我結束了在全球範圍初始化DispatcherHelper的App.xaml.cs OnLaunched方法內。

+0

既然你已經標記爲異步的方法,是有可能,主線程繼續,並修改別的東西在同一時間,你看到了競賽狀況的結果? – PhilChuang

+0

我沒有看到任何像DispatcherHelper.Initialize()這樣的靜態方法應該拋出'NullReferenceException'的原因。你的問題顯然缺乏一些重要的細節。但請參閱標記爲重複的關於如何診斷和修復'NullReferenceException'的廣泛建議。如果您無法使用該建議解決您的問題,請發佈一個新問題,在該問題中,您提供了一個可靠地再現問題的良好[mcve],並且詳細解釋了迄今爲止解決問題所做的工作問題以及你無法弄清的具體問題。 –

+4

@PeterDuniho,請停止!濫用StackOverflow給您的權力/特權。將用戶發送到通用/長話題並將帖子標記爲重複項是不合適的。朱利恩優雅地回答了下面的問題。如果您有更好的方法,歡迎您添加它! – usefulBee

回答

2

看起來你在後臺線程中調用DispatcherHelper.Initialize()。在這裏它不能訪問Dispatcher對象。

需要初始化它在UI線程上,作爲documentation說:

Initialize. This method should be called once on the UI thread to ensure that the UIDispatcher property is initialized.

+0

非常好!只要在異步函數之外完成DispatcherHelper從View Code Behind或ViewModel的初始化即可解決問題。 – usefulBee