Утилизируйте наблюдаемые предметы по мере их создания - PullRequest
0 голосов
/ 03 июня 2018

У меня есть IObservable, который генерирует предметы одноразового использования, и он генерирует потенциально бесконечное количество их в течение своей жизни.Из-за этого я хочу избавляться от последнего элемента каждый раз, когда создается новый элемент, поэтому оператор Using не будет работать для этого.Есть ли другой оператор Rx.NET, который может выполнить эту функцию?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Если у вас есть IObservable<IDisposable> source, сделайте это, чтобы автоматически удалить предыдущее значение и очистить после окончания последовательности:

IObservable<IDisposable> query =
    Observable.Create<IDisposable>(o =>
    {
        var serial = new SerialDisposable();
        return new CompositeDisposable(
            source.Do(x => serial.Disposable = x).Subscribe(o),
            serial);
    })
0 голосов
/ 03 июня 2018

Я наткнулся на этот ответ Шломо и адаптировал его для своих собственных целей:

public class DisposerProperty<T> : IDisposable, IObservable<T> where T : IDisposable
{
    private IDisposable Subscription { get; }
    private IObservable<T> Source { get; }

    public T Value { get; private set; }

    public DisposerProperty(IObservable<T> source, T defaultValue = default)
    {
        Value = defaultValue;
        Source = source;
        Subscription = source.Subscribe(t =>
                                        {
                                            Value?.Dispose();
                                            Value = t;
                                        });
    }

    public void Dispose() => Subscription.Dispose();

    /// <inheritdoc />
    public IDisposable Subscribe(IObserver<T> observer) => Source.Subscribe(observer);
}

Теперь, когда я хочу эту функциональность, я просто использую DisposerProperty<T> вместоподписавшись на наблюдаемое напрямую.

...