Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不';t Bind和OneWayBind是否始终使用主UI线程?_C#_Reactiveui - Fatal编程技术网

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);