簡體   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