使用 Observable.FromEvent 创建的 observable 何时会与事件生产者分离?
更新:发现类似的问题: 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
该框架确保在序列完成或出错时处理从
Subscribe
返回的IDisposable
值,以及由FromEvent 返回的
取消订阅该事件。IDisposable
值由于
First
是Take(1)
的阻塞实现,因此源序列将在收到第一个值后(或者当源为空时抛出异常后)被处理)。简而言之,您可以确定在对
First
的调用完成后,事件处理程序将被删除。The framework ensures that the
IDisposable
value returned fromSubscribe
is disposed of when the sequence completes or errors, and theIDisposable
returned byFromEvent
unsubscribes from the event.Since
First
is a blocking implementation ofTake(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.