订阅前运行ToProperty

时间:2017-12-24 14:15:00

标签: c# .net system.reactive reactive-programming reactiveui

我有一个ReactiveCommand,它产生一个整数作为输出。

public ReactiveCommand<Unit, int> Calculate { get; }

此命令的最新结果使用ObservableAsPropertyHelper

存储在变量中
private readonly ObservableAsPropertyHelper<int> _latestValue;
public int LatestValue => _latestValue.Value;
...
Update.ToProperty(this, vm => vm.LatestValue, out _latestValue);

每次运行Calculate时,其输出都会存储在LatestValue中。 但是,当我做这样的事情时,我遇到了一个问题:

anotherObservable.SelectMany(_ => Calculate.Execute())
    .Select(value => value == LatestValue);

此可观察对象的结果似乎总是错误的,因为Select()在ObservableAsPropertyHelper更新LatestValue之前运行,因此LatestValue具有过时的值。

这是一个问题,因为我想在observable生成一个值时运行一个函数,而这个函数需要来自Calculate的最新值。我不能从observable传递新值,它需要在变量中。

我考虑过执行Calculate,然后等待使用LatestValue更新WhenAnyValue。然而,这很容易出错,因为更新可能是由先前的执行引起的,而且通常看起来很糟糕。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

听起来最好的解决方案是在WhenAnyValue属性上使用LatestValue。这样你就可以随时获得最新的价值。

正如你所提到的那样,你得到一个竞争条件,我认为最好避免同时做不完全相同的工作。让OAPH设置并从中开始工作。

您可能希望跳过WhenAnyValue(带Skip(1))的第一个信号,因为该属性的当前值会立即返回。