Xamarin 切换到ShouldAlwaysRaiseInputConUserInterfaceThread(false)MVVMCross

Xamarin 切换到ShouldAlwaysRaiseInputConUserInterfaceThread(false)MVVMCross,xamarin,mvvmcross,Xamarin,Mvvmcross,我们正在从MVVMCross 4.1过渡到4.4。我们要考虑的主要问题之一是在4.2中引入的MVxtaskBaseButin上下文。 上面说 要充分利用MvxTaskBasedBindingContext,您应该 同时调用shouldallwaysraiseinpconuserinterfacethread(false);在 ViewModel构造函数 MvxTaskBasedBindingContext听起来是件好事,因此我们希望“充分利用”它。然而,毫不奇怪,不再总是在UI线程上引发INot

我们正在从MVVMCross 4.1过渡到4.4。我们要考虑的主要问题之一是在4.2中引入的MVxtaskBaseButin上下文。

上面说

要充分利用MvxTaskBasedBindingContext,您应该 同时调用shouldallwaysraiseinpconuserinterfacethread(false);在 ViewModel构造函数

MvxTaskBasedBindingContext听起来是件好事,因此我们希望“充分利用”它。然而,毫不奇怪,不再总是在UI线程上引发INotifyPropertyChanged会给我们带来大量的线程编组错误

“应用程序调用了为不同线程封送的接口”

是否有一种建议的方法可以移动到shouldallwaysraiseinpconuserinterfacethread(false)模型,并且仅在某些场景下才值得使用?

如果您查看
MvxNotifyPropertyChanged
的,您将看到默认情况下,
RaisePropertyChanged
PropertyChanged
事件封送到UI线程

因此,如果对PropertyChanged事件执行单元测试,它们可能会中断,因为没有
调度程序。设置
shouldlwaysraiseinpconuserinterfacethread(false)
将防止出现这种情况,提升将直接在此时的线程上完成

当您有意在另一个线程中订阅
PropertyChanged
时,这也很方便

如果需要,可以将其设置为
false
,并在基础viewmodel类上创建一个方法来执行以下操作:

this.InvokeOnMainThread(()=>this.RaisePropertyChanged(propertyName))

因此,您总是使用
RaisePropertyChangedOnMainThread
(我们这样命名),并且不会发生线程编组错误

资料来源: