C# 如何设置可观察对象来观察属性?
我意识到这可能是一个非常愚蠢的问题,但是关于反应式扩展的文档既不透明又分散 假设我有一节课C# 如何设置可观察对象来观察属性?,c#,system.reactive,C#,System.reactive,我意识到这可能是一个非常愚蠢的问题,但是关于反应式扩展的文档既不透明又分散 假设我有一节课 public class Foo { public int FooState {get;set;} } 而且FooState的更新非常频繁。这看起来是IObservable的理想情况,特别是因为我必须在另一个类中跟踪该状态 public class Bar { public Foo Foo {get;set;} private void DoStuffWithFooState(
public class Foo
{
public int FooState {get;set;}
}
而且FooState的更新非常频繁。这看起来是IObservable的理想情况,特别是因为我必须在另一个类中跟踪该状态
public class Bar
{
public Foo Foo {get;set;}
private void DoStuffWithFooState()
{
//operate on Foo.FooState here
}
}
现在,我不能将FooState更改为IObservable,因为这会破坏其他依赖于Foo的东西
我想做的是在监视FooState的条上声明一个IObserver属性
这不是一个基本的用例吗?我该怎么做呢?您可以使用将属性转换为可观察的流和可以读取最新值的属性
public class Foo
{
private readonly BehaviorSubject<int> _fooSubject = new BehaviorSubject<int>(0);
public int FooState
{
get => _fooSubject.Value;
set => _fooSubject.OnNext(value);
}
public IObservable<int> ObservableFooState => _fooSubject;
}
请注意,一个常见的错误是使用,然后想知道为什么你几乎从来没有得到任何事件!(原因是每次新事件到达时,节流阀都会重置超时,因此当流频繁更新时,您将永远不会超过超时值。)
虽然它很旧,而且在某些方面有点过时,但我发现它在尝试学习反应式时非常有用。虽然更旧、更过时,但仍然是一个非常有用的概念性介绍-只是不要将代码示例太过字面化
如果这个类实际上是一个ViewModel,你可能想考虑一下,但是我建议你避开它,直到你对反应非常满意。
注意,我没有在上面显示Dispose/Completion逻辑。你应该考虑什么时候(如果有)你想调用一个完整的子对象。还请记住,您可能希望确保在订户超出范围时处理它们 谢谢大家!!该类不是viewmodel,它是由外部服务操作的对象的内存缓存的一部分。您最初的问题是是否确实不需要更改Foo。这回答了你的问题吗?回答了,因为你的回答保留了Foo的签名。非常感谢。
//print out value every two seconds
foo.ObservableFooState
.Sample(TimeSpan.FromSeconds(2))
.Subscribe(Console.WriteLine);