我正在使用Reactive Extensions在我的ViewModel(Silverlight和/或Wp7应用程序)中轻松处理事件.为了简单起见,我想在我的VM的ctor中有这样的一行:
Observable.FromEvent<PropertyChangedEventArgs>(
h => MyObject.PropertyChanged += h,
h => MyObject.PropertyChanged -= h)
.Where(e=>e.PropertyName == "Title")
.Throttle(TimeSpan.FromSeconds(0.5))
.Subscribe(e=>{/*do something*/});
Run Code Online (Sandbox Code Playgroud)
这将返回一个IDisposable对象,如果处置将取消订阅. (我在这个假设中是对的吗?)
如果我没有提及它,迟早会收集它,我的处理程序将被取消订阅.
我通常List<IDisposable>在我的虚拟机中有一个,我添加订阅,但我觉得它很脏,好像我没有以正确的Rx方式做某事.
在这种情况下,最佳做法,推荐模式是什么?
例如,考虑一下:
public IDisposable Subscribe<T>(IObserver<T> observer)
{
return eventStream.Where(e => e is T).Cast<T>().Subscribe(observer);
}
Run Code Online (Sandbox Code Playgroud)
这eventStream是一个长期存在的事件来源.一个短命的客户端将使用此方法订阅一段时间,然后通过调用Dispose返回来取消订阅IDisposable.
然而,虽然eventStream仍然存在并且应该保存在内存中,但是已经有2个新IObservables方法由此方法创建 - 由方法返回的Where()方法可能由内存保存在内存中eventStream,并且方法返回的方法可能保留在内存Cast<T>()中内存由Where()方法返回的内存.
这些'中间IObservables'(它们有更好的名字吗?)将如何清理?或者它们现在是否会存在,eventStream即使它们不再有订阅而没有其他人引用它们除了它们的来源IObservable,因此永远不会再有订阅?
如果他们通过告知他们的父母他们不再有订阅来清理他们,他们怎么知道没有其他人参考他们并且可能在某些时候后来订阅他们?