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

C# 如何从委托创建不从EventHandler继承的IObservable?,c#,system.reactive,C#,System.reactive,我正在使用Accord(以前是Forge)从网络摄像头捕获图像帧 这些图像通过视频捕获设备到达。新帧事件: public delegate void NewFrameEventHandler(object sender, NewFrameEventArgs eventArgs); public class NewFrameEventArgs : EventArgs { public Bitmap Frame { get; } public NewFrameEventArgs(

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

这些图像通过视频捕获设备到达。新帧事件:

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
}
我知道我不能使用可观察的
。FromEventPattern
,但我不知道该使用什么,更不用说如何使用了。

尝试以下方法:

var receivedFrames = Observable.FromEventPattern<NewFrameEventHandler, NewFrameEventArgs>(
  handler => handler.Invoke,
  h => videoSource.NewFrame += h,
  h => videoSource.NewFrame -= h);
var receivedFrames=Observable.FromEventPattern(
handler=>handler.Invoke,
h=>videoSource.NewFrame+=h,
h=>videoSource.NewFrame-=h);
当我第一次学习Rx时,我发现以下网站非常有用:(链接到我发现这个例子的部分)。

我想到了这个(并在LinqPad中测试了它)

var observable=observable.FromEvent(
(处理程序)=>
{
NewFrameEventHandler frameHandler=(发件人,e)=>
{
处理程序(e);
};
返回帧处理程序;
},
eh=>videoSource.NewFrame+=eh,
eh=>videoSource.NewFrame-=eh
);
observable.Subscribe((frameEventArgs)=>{frameEventArgs.Dump();});
这是一个很好的练习

因此它使用了
Observable.FromEvent


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

实际上它在没有第一个参数的情况下工作(也就是说,没有调用,只有赋值/取消赋值参数)。
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(); });