Когда наблюдаемый объект, созданный с помощью Observable.FromEvent, будет отсоединен от производителя событий?

ОБНОВЛЕНИЕ: найден аналогичный вопрос: Rx - отписка от событий

Учитывая код:

interface IBitmapCapturer {
    event EventHandler<EventArgs<RawBitmap>> Captured;
    void Start();
    void Stop();
}

public class Camera {
    IBitmapCapturer m_capturer;

    public RawBitmap CaptureBitmap() {
        IObservable<IEvent<EventArgs<RawBitmap>>> observable = Observable.FromEvent<EventArgs<RawBitmap>>(
            handler => m_capturer.Captured += handler,
            handler => m_capturer.Captured -= handler);
        m_capturer.Start();
        IEvent<EventArgs<RawBitmap>> evn = observable.First();
        m_capturer.Stop();
        return evn.EventArgs.EventData;
    }
}

Здесь я делаю снимок с камеры, но только первый. IBitmapCapturer — это что-то, связанное с DirectShow, и он не предоставляет метод «сделать снимок», а только генерирует события с растровыми изображениями. Поэтому я использую Reactive Extensions, чтобы принять первое событие и отписаться. Мои сомнения касаются строки "observable.First()".

Правильно ли я понимаю, что после вызова observable.First() моя наблюдаемая отсоединяется от m_capturer (производителя событий)? Если нет, то как мне убедиться, что на m_capturer.Captured нет подписчиков?


person Shrike    schedule 11.11.2010    source источник


Ответы (1)


Платформа гарантирует, что значение IDisposable, возвращаемое из Subscribe, удаляется, когда последовательность завершается или возникают ошибки, а IDisposable, возвращаемое FromEvent, отменяет подписку на событие.

Поскольку First является блокирующей реализацией Take(1), исходная последовательность будет удалена после получения первого значения (или после того, как будет выдано исключение, когда источник пуст).

Короче говоря, вы можете быть уверены, что обработчик событий будет удален после завершения вашего вызова First.

person Richard Szalay    schedule 12.11.2010
comment
да, Subscribe создает подписку, и ее нельзя удалить, но не результат FromEvent. Это не подписка, это своего рода адаптер от события С# к IObservable (не наблюдатель).. - person Shrike; 12.11.2010
comment
Я понимаю это, но удаление возвращаемого значения FromEvent().Subscribe() все равно удалит подписку. - person Richard Szalay; 12.11.2010
comment
Вы не можете использовать First здесь именно потому, что, как говорит Ричард, это блокирует: вы загоняете себя в тупик. - person Ana Betts; 16.11.2010
comment
Павел, это код из живого проекта, никакого тупика нет. Если вы имели в виду блоки, а не взаимоблокировки, то да, блокирует - это именно то, что мне нужно. - person Shrike; 23.11.2010
comment
@PaulBetts - это будет зависеть от того, в каком потоке запускается событие OnNext. - person Niall Connaughton; 07.05.2013