2017-06-09 165 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