更新:发现了类似的问题: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上没有订阅者?
答案 0 :(得分:3)
该框架确保在序列完成或错误时处理从IDisposable
返回的Subscribe
值,并且IDisposable
返回的FromEvent
取消订阅该事件。
由于First
是Take(1)
的阻塞实现,源序列将在收到第一个值之后(或者在源为空时抛出异常之后)处理。
简而言之,您可以确保在致电First
完成后删除了事件处理程序。