Делайте «промежуточные IObservables» без сохранения конечных подписчиков в памяти на время жизни корневого IObservable

Например, рассмотрим следующее:

    public IDisposable Subscribe<T>(IObserver<T> observer)
    {
        return eventStream.Where(e => e is T).Cast<T>().Subscribe(observer);
    }

eventStream— это долгоживущий источник событий. Недолговечный клиент будет использовать этот метод для подписки на некоторый период времени, а затем откажется от подписки, вызвав Disposeдля возвращенного IDisposable.

Однако, несмотря на то, что eventStreamвсе еще существует и должен храниться в памяти, этим методом было создано 2 новых IObservables— один, возвращенный методом Where( )метод, который предположительно хранится в памяти eventStream, и метод, возвращаемый методом Cast(), который предположительно хранится в памяти возвращенным методом Where().

Как будут очищаться эти «промежуточные IObservables» (есть ли для них лучшее название?)? Или они теперь будут существовать в течение всего времени существования eventStream, даже если у них больше нет подписок и никто другой не ссылается на них, кроме их источника IObservable, и поэтому у них больше никогда не будет подписок?

Если их очистить, сообщив родителю, что у них больше нет подписок, как они узнают, что никто другой не взял на них ссылку и может в какой-то момент позже подписаться на них?

5
задан Tyson 28 March 2012 в 04:25
поделиться