使用Observable.FromEvent创建的observable将与事件生成器分离吗?

时间:2010-11-11 14:49:26

标签: c# system.reactive

更新:发现了类似的问题:Rx - unsubscribing from events

鉴于代码:

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()后,我的observable与m_capturer(事件生成器)分离了?如果没有,那我怎样才能确保m_capturer.Captured上没有订阅者?

1 个答案:

答案 0 :(得分:3)

该框架确保在序列完成或错误时处理从IDisposable返回的Subscribe值,并且IDisposable返回的FromEvent取消订阅该事件。

由于FirstTake(1)的阻塞实现,源序列将在收到第一个值之后(或者在源为空时抛出异常之后)处理。

简而言之,您可以确保在致电First完成后删除了事件处理程序。