如何设置 Observable 来观看 属性?
How do I set an Observable to watch a Property?
我意识到这可能是一个非常愚蠢的问题,但 Reactive Extensions 的文档既不透明又分散。
假设我有一个 class
public class Foo
{
public int FooState {get;set;}
}
并且 FooState 更新非常频繁。这看起来像是 IObservable 的理想情况,特别是因为我必须在另一个 class.
中跟踪该状态
public class Bar
{
public Foo Foo {get;set;}
private void DoStuffWithFooState()
{
//operate on Foo.FooState here
}
}
现在,我无法将 FooState 更改为 IObservable,因为那样会破坏依赖于 Foo 的其他内容。
我想做的是在监视 FooState 的 Bar 上声明一个 IObserver 属性。
这不是基本用例吗?我该怎么做?
您可以使用 BehaviorSubject 将 属性 转换为可观察流和 属性,您可以从中读取最新值。
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;
}
如果 FooState 的值经常变化,那么您可能希望在订阅之前使用 Sample 运算符。例如
//print out value every two seconds
foo.ObservableFooState
.Sample(TimeSpan.FromSeconds(2))
.Subscribe(Console.WriteLine);
请注意,一个常见的错误是使用 Throttle 然后想知道为什么您几乎得不到任何事件! (原因是 Throttle 会在每次新事件到达时重置超时,因此当流更新频繁时,您永远不会超过超时值。)
虽然它有些陈旧并且有些过时,但我发现 this guide to be very useful when trying to learn about Reactive. The Rx HOL 甚至更老更过时,但仍然是一个非常有用的概念介绍 - 只是不要太字面地理解代码示例。
如果这个 class 实际上是一个 ViewModel,您可能需要考虑 ReactiveUI,但我建议您在真正熟悉 Reactive 之前不要使用它。
请注意,我没有在上面显示 Dispose/Completion 逻辑。你应该考虑什么时候(如果有的话)你想在 _fooSubject 上调用 OnCompleted。还要记住 subscriptions are disposable 并且您可能希望确保在订阅者超出范围时处理它们。
我意识到这可能是一个非常愚蠢的问题,但 Reactive Extensions 的文档既不透明又分散。
假设我有一个 class
public class Foo
{
public int FooState {get;set;}
}
并且 FooState 更新非常频繁。这看起来像是 IObservable 的理想情况,特别是因为我必须在另一个 class.
中跟踪该状态public class Bar
{
public Foo Foo {get;set;}
private void DoStuffWithFooState()
{
//operate on Foo.FooState here
}
}
现在,我无法将 FooState 更改为 IObservable
我想做的是在监视 FooState 的 Bar 上声明一个 IObserver 属性。
这不是基本用例吗?我该怎么做?
您可以使用 BehaviorSubject 将 属性 转换为可观察流和 属性,您可以从中读取最新值。
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;
}
如果 FooState 的值经常变化,那么您可能希望在订阅之前使用 Sample 运算符。例如
//print out value every two seconds
foo.ObservableFooState
.Sample(TimeSpan.FromSeconds(2))
.Subscribe(Console.WriteLine);
请注意,一个常见的错误是使用 Throttle 然后想知道为什么您几乎得不到任何事件! (原因是 Throttle 会在每次新事件到达时重置超时,因此当流更新频繁时,您永远不会超过超时值。)
虽然它有些陈旧并且有些过时,但我发现 this guide to be very useful when trying to learn about Reactive. The Rx HOL 甚至更老更过时,但仍然是一个非常有用的概念介绍 - 只是不要太字面地理解代码示例。
如果这个 class 实际上是一个 ViewModel,您可能需要考虑 ReactiveUI,但我建议您在真正熟悉 Reactive 之前不要使用它。
请注意,我没有在上面显示 Dispose/Completion 逻辑。你应该考虑什么时候(如果有的话)你想在 _fooSubject 上调用 OnCompleted。还要记住 subscriptions are disposable 并且您可能希望确保在订阅者超出范围时处理它们。