使用 Observable.FromEvent 创建的 observable 何时会与事件生产者分离?

发布于 2024-10-02 01:34:42 字数 1084 浏览 0 评论 0原文

更新:发现类似的问题: 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相关的东西,不提供“拍摄”的方法,仅生成带有位图的事件。因此,我使用反应式扩展来获取第一个事件并取消订阅。 我的疑问是关于“observable.First()”行。

我是否正确理解在调用 observable.First() 之后我的 observable 与 m_capturer (事件生成器)分离?如果不是,那么我如何确保 m_capturer.Captured 上没有订阅者?

UPDATE: found similar question: Rx - unsubscribing from events

Given the code:

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;
    }
}

What I'm doing here is capturing a shot from Camera but the only first one. IBitmapCapturer is some DirectShow-related stuff and doesn't provide a method to "make a shot", only generating events with bitmaps. So I'm using Reactive Extensions to take the first event and unsubscribe.
My doubts are about "observable.First()" line.

Do I understand correctly that after calling observable.First() my observable is detached from m_capturer (event producer)? If not then how can I make sure that there're no subscribers on m_capturer.Captured?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

所谓喜欢 2024-10-09 01:34:42

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

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

简而言之,您可以确定在对 First 的调用完成后,事件处理程序将被删除。

The framework ensures that the IDisposable value returned from Subscribe is disposed of when the sequence completes or errors, and the IDisposable returned by FromEvent unsubscribes from the event.

Since First is a blocking implementation of Take(1), the source sequence will be disposed after the first value is received (or after it throws an exception when the source is empty).

In short, you can be sure that the event handler is being removed after your call to First completes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文