Когда observable, созданный с помощью Observable.FromEvent, будет отсоединен от производителя событий? - PullRequest
1 голос
/ 11 ноября 2010

ОБНОВЛЕНИЕ: найден похожий вопрос: 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 нет подписчиков?

1 Ответ

3 голосов
/ 12 ноября 2010

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

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

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

...