设置ViewModel属性是否在Xamarin Forms中具有线程关联?

Owe*_*enP 7 mvvm xamarin.forms

前几天,在代码审查中,我看到了一些关于从工作线程设置属性的安全性的问题.一位同事发表了评论,"此属性绑定到UI,数据绑定是线程安全的."

我一直在使用XF,但总是认为这不是真的:如果我想更新绑定到UI的ViewModel属性,我必须在UI线程上进行这些更改.我只花了几分钟探索文档,除了直接操作BindableProperties具有线程关联性之外,我没有看到明显的答案.如果那是阻止UI线程执行,那对我来说也很重要.

我可以制作一个项目来自己测试,但这些问题似乎总是间歇性的,所以我想知道我只是错过了正确的文档.

(这与调查崩溃有关,我们看到主要发生在Xamarin调用堆栈中.我们从工作线程引发事件,VM处理该事件并更新一些属性.如果这是为UI线程安排的,可能会有我们没有准备好一些交错问题,而且我更接近于解决崩溃问题.如果它没有安排用于UI线程......我很惊讶它的工作时间很长.)

Ste*_*oix 3

我已经使用 XF 一段时间了,但始终认为这不是真的:如果我想更新绑定到 UI 的 ViewModel 属性,我必须在 UI 线程上进行这些更改。

你说得对。100%正确。您可以用于Device.InvokeOnMainThread()此用途。

为了完整起见,有一种情况并不重要:PropertyChanged

https://github.com/xamarin/Xamarin.Forms/blob/b645064/Xamarin.Forms.Core/BindingExpression.cs#L542

在这种情况下,Binding将应用于主 (UI) 线程。

  • 这似乎意味着从任何线程更新我的虚拟机都是安全的,因为虚拟机传统上是 INotifyPropertyChanged 实现。正确的? (2认同)