如何从不从EventHandler继承的委托创建IObservable?

时间:2017-06-05 15:13:41

标签: c# system.reactive

我正在使用Accord(以前的AForge)从网络摄像头捕获图像帧。

这些图片是通过VideoCaptureDevice.NewFrame事件到达的:

public delegate void NewFrameEventHandler(object sender, NewFrameEventArgs eventArgs);

public class NewFrameEventArgs : EventArgs
{
    public Bitmap Frame { get; }

    public NewFrameEventArgs(Bitmap frame);
}

问题是,我尝试使用Observable.FromEvent,但在很多可能的重载中丢失了:

void Run()
{
    var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

    VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);

    // regular way
    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);

    // intended rx way
    var receivedFrames = Observable.FromEvent(????)    /////////// How?
}

void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    // do something
}

我知道我不能使用Observable.FromEventPattern,但不知道该使用什么,更不用说了。

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

var receivedFrames = Observable.FromEventPattern<NewFrameEventHandler, NewFrameEventArgs>(
  handler => handler.Invoke,
  h => videoSource.NewFrame += h,
  h => videoSource.NewFrame -= h);

当我第一次学习Rx时,我发现以下网站非常有用:IntroToRx(链接转到我找到这个例子的部分)。

答案 1 :(得分:1)

我想出了这个(并在LinqPad中进行了测试)

var observable = Observable.FromEvent<NewFrameEventHandler, NewFrameEventArgs>(
    (handler) =>
    {
        NewFrameEventHandler frameHandler = (sender, e) =>
        {
            handler(e);
        };

        return frameHandler;
    },
    eh => videoSource.NewFrame += eh,
    eh => videoSource.NewFrame -= eh
);

observable.Subscribe((frameEventArgs) => { frameEventArgs.Dump(); });

根据this question的答案,这是一个很好的练习。

因此它使用Observable.FromEvent的{​​{3}}。

很高兴知道它是否可以写得更紧凑。

相关问题