繁体   English   中英

用 Observable.Create 包裹 Observable.FromEventPattern

[英]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被调用时, propertyNamepropertySelector将被评估,并且在第一个块中,每当有人订阅可观察对象时,这些变量将被评估。 但是,我无法弄清楚第一个块是否/为什么比第二个更可取,以及为什么第一个块的作者决定使用Observable.Create

来自GitHub上第一块代码的作者的回答:

我对此的立场是调用返回 IObservable 的方法不应该做任何事情。 应该调用任何副作用或处理的是对该返回值的订阅。

如果订阅成本需要在多个订阅之间分摊,则应应用 Rx 中的各种多播选项。

在这种特定情况下,这个论点很弱,但是它会混淆模式并为其他方法打开大门,无需订阅即可“工作”。 我认为这是一个非常常见的错误,也是竞争条件和资源泄漏的根源(想想打开连接、启动计时器等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM