Reputation: 27615
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.
Upvotes: 2
Views: 222
Reputation: 29880
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.
Upvotes: 1
Reputation: 4913
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).
Upvotes: 2