我怎么能避免rpce_wrong_thread时更新我的视图模型

本文关键字:更新 我的 模型 视图 thread wrong 能避免 rpce | 更新日期: 2023-09-27 18:07:31

我正在开发一个在Windows 8.1上运行的通用应用程序&Windows Phone 8.1。在旧的基于Silverlight的Windows Phone应用程序中,我可以在我的视图模型上有一个方便的助手,比如:

protected delegate void OnUIThreadDelegate();
protected static void OnUIThread(OnUIThreadDelegate onUIThreadDelegate)
{
    if (onUIThreadDelegate != null)
    {
        if (Deployment.Current.Dispatcher.CheckAccess())
        {
            onUIThreadDelegate();
        }
        else
        {
            Deployment.Current.Dispatcher.BeginInvoke(onUIThreadDelegate);
        }
    }
}

从我所看到的使用async,我应该能够做这样的事情:

async void Watcher_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    this.Latitude = args.Position.Coordinate.Point.Position.Latitude;
    this.Longitude = args.Position.Coordinate.Point.Position.Longitude;
    // TODO: Consider reloading;
    var ev = await SpecialEvent.SearchNearAsync();
    this.Events.Clear(); // this is an ObservableCollection that the XAML is bound to,
                         // and I'm seeing it blow up with RPC_E_WRONG_THREAD here
}

使用Dispatcher的其他选项似乎更难,因为,在通用应用程序中,Application.Current没有Dispatcher属性?

那么剩下的选项是什么呢?我是否必须更改我的视图模型以允许从视图传递调度程序,或者我错过了更明显的东西?

我怎么能避免rpce_wrong_thread时更新我的视图模型

您可以使用:

从任何线程获取分派器。
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

关于async -它所做的是在另一个线程中调用(部分)等待方法,当它完成时,返回到第一个线程并继续在那里执行。所以在你的情况下,Watcher_PositionChanged方法只是没有在UI线程中调用,所以它没有访问UI元素。

注意(关于异步):如果你有一个异步方法,它不会在另一个线程中自动调用。如果您想在不同的线程中执行它的一部分,则必须手动告诉它这样做。否则就会很不同步。此外,当等待时,您可以将其配置为继续在第二个线程上运行——为异步工作创建的线程。

相关文章: