C# 为什么不';t Bind和OneWayBind是否始终使用主UI线程?
在我的C# 为什么不';t Bind和OneWayBind是否始终使用主UI线程?,c#,reactiveui,C#,Reactiveui,在我的ViewModel中,我通常会有如下代码: public bool IsDownloading { get { return _isDownloading.Value; } } private ObservableAsPropertyHelper<bool> _isDownloading; ... FileDownloader.WhenAny(x => x.IsDownloading, x => x.Value) .ToProperty(this, x =
ViewModel
中,我通常会有如下代码:
public bool IsDownloading { get { return _isDownloading.Value; } }
private ObservableAsPropertyHelper<bool> _isDownloading;
...
FileDownloader.WhenAny(x => x.IsDownloading, x => x.Value)
.ToProperty(this, x => x.IsDownloading, out _isDownloading, false, RxApp.MainThreadScheduler);
这里您可以看到IsDownloading
将被路由到控件上的IsActive
项,因此任何更新都必须在UI线程上进行。所有这些都有效
但是我不明白为什么ReactiveUI
是这样设计的。更新发生在UI线程上似乎对视图(而不是VM)很重要,因此不应该绑定或OneWayBind
确保它位于正确的线程上?事实上,如果您查看这些例程的XML文档,它们会讨论将内容附加到视图,因此其含义是它应该始终位于主线程上
那么:
OneWayBind
和Bind为什么不隐式地强制主线程
?我是否错过了ReactiveUI
如何工作(或如何使其工作)?是的,我刚刚在iOS应用程序上遇到了这个问题。。。我的猜测是,它不希望过于固执己见,因为您可以绑定到视图类中的几乎任何属性,而这些属性可能是您不希望在uithread上设置的?看起来有95%的时间你都希望在UIThread上使用这个。。。也许绑定上的一个可选参数指示调度程序将有助于处理边缘情况,然后将其默认为UIThread这正是我的想法;这让我怀疑我是否错过了架构中的一些东西。我在github上发现了这样一条评论:“由于性能原因,绑定不会自动将内容移动到UI线程”,所以我猜FW只是想让您承担这个负担,这样在未经您允许的情况下,它不会给UI线程带来过多负担。。。为了安全起见,我可能会像上面那样开始执行所有属性绑定:-)啊哈!好发现。我怀疑原因是BindTo方法被用于绑定到不需要UI线程的东西,并且被构建为用于UI相关的东西(比如OneWayBind和bind)。好的,如果是这样的话,那么也许正确的方法是创建一个OneWayBindUI方法。然后我可以把我所有的观察从我的虚拟机(它不应该有UI的)和移动到视图。。。现在线程模型仍然包含(并确保)在一个地方:视图。既然你找到了这个,@ShaneNeuville,请随意在下面写一个简短的答案!
this.OneWayBind(ViewModel, x => x.IsDownloading, y => y.DownloadProgress.IsActive);