[英]Wrap Observable.FromEventPattern with Observable.Create
这之间的区别(取自GitHub 上的 RxCookbook ):
public static IObservable<TProperty> OnPropertyChanges<T, TProperty>(this T source, Expression<Func<T, TProperty>> property)
where T : INotifyPropertyChanged
{
return Observable.Create<TProperty>(o=>
{
var propertyName = property.GetPropertyInfo().Name;
var propertySelector = property.Compile();
return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
handler => handler.Invoke,
h => source.PropertyChanged += h,
h => source.PropertyChanged -= h)
.Where(e => e.EventArgs.PropertyName == propertyName)
.Select(e => propertySelector(source))
.Subscribe(o);
});
}
还有这个(我自己写的):
public static IObservable<TProperty> OnPropertyChanges<T, TProperty>(this T source, Expression<Func<T, TProperty>> property)
where T : INotifyPropertyChanged
{
var propertyName = property.GetPropertyInfo().Name;
var propertySelector = property.Compile();
return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
handler => handler.Invoke,
h => source.PropertyChanged += h,
h => source.PropertyChanged -= h)
.Where(e => e.EventArgs.PropertyName == propertyName)
.Select(e => propertySelector(source));
}
我认为在第二个代码块中,当OnPropertyChanges
被调用时, propertyName
和propertySelector
将被评估,并且在第一个块中,每当有人订阅可观察对象时,这些变量将被评估。 但是,我无法弄清楚第一个块是否/为什么比第二个更可取,以及为什么第一个块的作者决定使用Observable.Create
。
来自GitHub上第一块代码的作者的回答:
我对此的立场是调用返回 IObservable 的方法不应该做任何事情。 应该调用任何副作用或处理的是对该返回值的订阅。
如果订阅成本需要在多个订阅之间分摊,则应应用 Rx 中的各种多播选项。
在这种特定情况下,这个论点很弱,但是它会混淆模式并为其他方法打开大门,无需订阅即可“工作”。 我认为这是一个非常常见的错误,也是竞争条件和资源泄漏的根源(想想打开连接、启动计时器等)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.