【问题标题】:Setting a ViewModel UI Property from an Async Method从异步方法设置 ViewModel UI 属性
【发布时间】:2017-11-11 22:51:01
【问题描述】:

我正在尝试通过异步方法设置 ViewModel List 属性,但这以以下错误结束:

{“应用程序调用了一个为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))”}

错误很明显。我不清楚的是克服这个问题并成功设置属性进而更新 UI 的最佳方法。

以下尝试以对象引用未设置为对象的实例结束在初始化调度程序时出错:

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

解决这个问题的最佳方法是什么?

更新:

我最终在 App.xaml.cs OnLaunched 方法中全局初始化 DispatcherHelper。

【问题讨论】:

  • 由于您将方法标记为异步,是否有可能主线程继续运行并同时修改其他内容并且您看到了竞争条件的结果?
  • 我看不出有任何理由像DispatcherHelper.Initialize() 这样的静态方法应该抛出NullReferenceException。您的问题显然缺少一些重要的细节。但有关如何诊断和修复NullReferenceException 的广泛建议,请参阅标记重复。如果您无法使用该建议解决您的问题,请发布一个新问题,其中您提供了一个很好的minimal reproducible example 可以可靠地重现问题,并且您已经详细解释了到目前为止您为解决问题所做的工作问题以及具体您无法弄清楚的问题。
  • @PeterDuniho,请停下!滥用 StackOverflow 赋予您的权力/特权。将用户发送到通用/长主题并将帖子标记为重复是不合适的操作。朱利安优雅地回答了下面的问题。如果你有更好的方法,欢迎补充!

标签: c# mvvm uwp mvvm-light


【解决方案1】:

看起来您正在后台线程中调用DispatcherHelper.Initialize()。在这里,它无权访问 Dispatcher 对象。

您需要在 UI 线程上对其进行初始化,如documentation 中所述:

初始化。此方法应在 UI 线程上调用一次,以确保 UIDispatcher 属性已初始化。

【讨论】:

  • 太棒了!只要在异步函数之外完成,从 View Code Behind 或 ViewModel 初始化 DispatcherHelper 即可解决问题。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多