2017-06-05 9 views
2

私は、Accord(以前はAForge)を使ってウェブカメラから画像フレームをキャプチャしています。EventHandlerから継承しないデリゲートからIObservableを作成するには?

これらのイメージは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

は、以下のことを試してみてください。

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

私は最初のRxを学んでいたとき、私は以下のサイトは非常に役に立った:IntroToRx(リンクは私がこの例を発見した部分に行きます)。

+1

実際には、最初の引数なしで(つまり、Invokeなしで、代入/割り当て解除の引数のみで)機能しました。 – heltonbiker

1

私はそれはthis questionの回答に基づいて素敵な運動だった

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(); }); 

この思い付いた(とLinqPadでそれをテストしました)。

this overloadObservable.FromEventを使用します。

もっとコンパクトに書き込めるかどうか知ることができます。

関連する問題