C# 从事件创建可观察对象时出错

C# 从事件创建可观察对象时出错,c#,system.reactive,C#,System.reactive,我试图从一个事件中创建一个可观察的序列。该活动具有以下特征: event SensorValueChangedEventHandler SensorValueChanged; 我试图通过以下方式创建可观察对象: var eventAsObservable = Observable.FromEvent( (EventHandler<SensorValueChangedEventArgs> ev) => new Se

我试图从一个事件中创建一个可观察的序列。该活动具有以下特征:

event SensorValueChangedEventHandler SensorValueChanged;
我试图通过以下方式创建可观察对象:

var eventAsObservable = Observable.FromEvent(
                                (EventHandler<SensorValueChangedEventArgs> ev) => new SensorValueChangedEventHandler(ev), 
                                ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
                                ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);

我想知道是否有人可以评论如何正确地从这个事件中创建一个可观察的对象。

您很可能需要这样做:

var eventAsObservable = Observable.FromEvent<SensorValueChangedEventHandler, SensorValueChangedEventArgs>(
    handler => (sender, args) => handler(args),
    ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
    ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);
var eventAsObservable =
    Observable
        .FromEventPattern<SensorValueChangedEventHandler, SensorValueChangedEventArgs>(
                ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
                ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);
var eventAsObservable=Observable.FromEvent(
处理程序=>(发送方,args)=>处理程序(args),
ev=>CrossDeviceMotion.Current.SensorValueChanged+=ev,
ev=>CrossDeviceMotion.Current.SensorValueChanged-=ev);

在第一个参数中,您告诉如何在
操作
(基本上是
OnNext
)和您的代理之间映射。在第二个和第三个参数中,您传递subscribe和unsubscribe函数。

您似乎使用了一种过时的方法来观察标准.NET事件-它不再是
FromEvent
-您应该使用
FromEventPattern

代码应该如下所示:

var eventAsObservable = Observable.FromEvent<SensorValueChangedEventHandler, SensorValueChangedEventArgs>(
    handler => (sender, args) => handler(args),
    ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
    ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);
var eventAsObservable =
    Observable
        .FromEventPattern<SensorValueChangedEventHandler, SensorValueChangedEventArgs>(
                ev => CrossDeviceMotion.Current.SensorValueChanged += ev,
                ev => CrossDeviceMotion.Current.SensorValueChanged -= ev);
var事件可观测=
可观察
.FromEventPattern(
ev=>CrossDeviceMotion.Current.SensorValueChanged+=ev,
ev=>CrossDeviceMotion.Current.SensorValueChanged-=ev);

.FromEvent
方法用于处理非标准(不符合
(对象发送方,XxxEventArgs e)
签名)类型的事件。

您的SensorValueChangedEventHandler的定义是什么?@Evk
公共委托void SensorValueChangedEventHandler(对象发送方,SensorValueChangedEventHandler e)这不可编译。@Enigmativity在发布之前,我已经编译并运行了它,使用了nuget软件包中最新的Rx。也许你的意思是我使用变量“p”而不是OP的CrossDeviceMotion.Current,但这并不重要。我可以建议你使用
handler=>(sender,args)=>handler(args)
作为第一个参数吗?这比声明一个处理程序并返回它要简单得多。FromEvent不是“过时”的说法。当事件不符合标准的.NET事件模式(发送方+事件参数)时,使用它。虽然在这种情况下,您确实可以使用FromEventPattern(或FromEvent)-但在某些情况下,您不能使用FromEventPattern。@Evk-抱歉,我刚才说的FromEventPattern对于“观察事件”是过时的,这就是我的意思。我指的是标准的.NET事件模式。你能在回答中澄清一下吗,这样我就可以收回我的投票吗?@Evk:我认为我正在处理的事件的定义与可观察的事件模式构造函数不符。这不对吗?如果是,您将如何使用EventPattern创建此观察者?@LuisDelgado您的事件是(对象发送者,SomeEventArgs e),因此它符合事件的标准.NET模式。您可以使用此答案中提供的代码。请注意,您的可观察对象不是纯SensorValueChangedEventArgs,而是EventPattern对象。