我怎么能避免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
属性?
那么剩下的选项是什么呢?我是否必须更改我的视图模型以允许从视图传递调度程序,或者我错过了更明显的东西?
您可以使用:
从任何线程获取分派器。var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
关于async -它所做的是在另一个线程中调用(部分)等待方法,当它完成时,返回到第一个线程并继续在那里执行。所以在你的情况下,Watcher_PositionChanged方法只是没有在UI线程中调用,所以它没有访问UI元素。
注意(关于异步):如果你有一个异步方法,它不会在另一个线程中自动调用。如果您想在不同的线程中执行它的一部分,则必须手动告诉它这样做。否则就会很不同步。此外,当等待时,您可以将其配置为继续在第二个线程上运行——为异步工作创建的线程。