[英]When to use Observable.FromEventPattern rather than Observable.FromEvent?
We've got a client calling off to a TIBCO EMS queue and are wiring up the events like this: 我们有一个客户端呼叫TIBCO EMS队列并正在连接这样的事件:
var msgConsumer = _session.CreateConsumer(responseQueue);
var response = Observable.FromEvent<EMSMessageHandler,EMSMessageEventArgs>
(h => msgConsumer.MessageHandler += h, h => msgConsumer.MessageHandler -= h)
.Where(arg => arg.Message.CorrelationID == message.MessageID);
When I call response.Subscribe(...)
I get System.ArgumentException "Error binding to target method." 当我调用
response.Subscribe(...)
我得到System.ArgumentException“绑定到目标方法的错误。”
I can make it work with Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")
but then it's got the event as a string and just not as clean. 我可以使用
Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")
但它然后将事件作为字符串而不是干净。
Also I have IObservable<EventPattern<EMSMessageEventArgs>>
rather than IObservable<EMSMessageEventArgs>
我还有
IObservable<EventPattern<EMSMessageEventArgs>>
而不是IObservable<EMSMessageEventArgs>
What I'd like to understand is: when should I use FromEvent
over FromEventPattern
? 我想要理解的是:我何时应该使用
FromEvent
不是FromEventPattern
? It seems a bit trial and error. 这似乎有点反复试验。
"Use FromEvent for events structurally don't look like a .NET event pattern (ie not based on sender, event args), and use FromEventPattern for the pattern-based ones." “结构上使用FromEvent表示事件看起来不像.NET事件模式(即不基于发送者,事件参数),并使用FromEventPattern作为基于模式的事件。” - Bart De Smet (Rx team)
- Bart De Smet(Rx团队)
To elaborate on this a bit further, you can typically determine when to choose one of the FromEvent
vs FromEventPattern
by the type of event used in the class you're trying to observe. 为了进一步详细说明,您通常可以确定何时从您尝试观察的类中使用的事件类型中选择
FromEvent
与FromEventPattern
之一。 Use FromEventPattern
when your event is of type EventHandler
or the generic EventHandler<T>
. 当事件的类型为
EventHandler
或通用的EventHandler<T>
时,请使用FromEventPattern
。 Use FromEvent
when you're using a custom, non-generic event handler type. 当您使用自定义的非泛型事件处理程序类型时,请使用
FromEvent
。 The following examples are lifted directly from the Rx wiki , which has lots of good examples- 101 of them to be exact. 以下示例直接从Rx wiki中提取,其中包含许多很好的示例- 其中101个是准确的。
FromEventPattern (with generic EventHandler) : FromEventPattern (使用通用EventHandler) :
class ObserveEvent_Generic
{
public class SomeEventArgs : EventArgs { }
public static event EventHandler<SomeEventArgs> GenericEvent;
static void Main()
{
// To consume GenericEvent as an IObservable:
IObservable<EventPattern<SomeEventArgs>> eventAsObservable = Observable.FromEventPattern<SomeEventArgs>(
ev => GenericEvent += ev,
ev => GenericEvent -= ev );
}
}
FromEvent: FromEvent:
class ObserveEvent_NonGeneric
{
public class SomeEventArgs : EventArgs { }
public delegate void SomeNonGenericEventHandler(object sender, SomeEventArgs e);
public static event SomeNonGenericEventHandler NonGenericEvent;
static void Main()
{
// To consume NonGenericEvent as an IObservable, first inspect the type of EventArgs used in the second parameter of the delegate.
// In this case, it is SomeEventArgs. Then, use as shown below.
IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent(
(EventHandler<SomeEventArgs> ev) => new SomeNonGenericEventHandler(ev),
ev => NonGenericEvent += ev,
ev => NonGenericEvent -= ev);
}
}
Apparently the new syntax has changed a bit. 显然,新语法有所改变。 The current syntax is the following:
目前的语法如下:
// get events as observable
var events = Observable.FromEvent<MouseButtonEventHandler, MouseEventArgs>(
handler => MouseUp += handler, handler => MouseUp -= handler);
// subscribe to events
var subscription = events.Subscribe(args => OnMouseUp()));
// always dispose subscriptions!
subscription.Dispose();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.