简体   繁体   中英

How to create IObservable from delegate that does not inherit from EventHandler?

I am using Accord (previously AForge) to capture image frames from a webcam.

These images arrive via a VideoCaptureDevice.NewFrame event:

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

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

    public NewFrameEventArgs(Bitmap frame);
}

The problem is, I tried to use Observable.FromEvent , but got lost in the many possible overloads:

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
}

I know I cannot use Observable.FromEventPattern , but don't know what to use instead, much less how.

Try the following:

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

When I was first learning Rx, I found the following site very helpful: IntroToRx (link goes to portion where I found this example).

I came up with this (and tested it in 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(); });

It was a nice exercise based on the answers of this question .

So it uses this overload of Observable.FromEvent .

Happy to know if it could be written more compact.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM