bar*_*ong 53 c# system.reactive
我们有一个客户端呼叫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);
Run Code Online (Sandbox Code Playgroud)
当我调用时,response.Subscribe(...)
我得到System.ArgumentException"绑定到目标方法的错误."
我可以使它工作,Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")
但然后它将事件作为一个字符串,而不是干净.
我也IObservable<EventPattern<EMSMessageEventArgs>>
不愿意IObservable<EMSMessageEventArgs>
我想了解的是:当我应该使用FromEvent
过FromEventPattern
?这似乎有点反复试验.
Ric*_*ein 64
"结构上使用FromEvent表示事件看起来不像.NET事件模式(即不基于发送者,事件参数),并使用FromEventPattern作为基于模式的事件." - Bart De Smet(Rx团队)
joe*_*dev 19
为了进一步详细说明,您通常可以确定何时根据您尝试观察的类中使用的事件类型选择一个FromEvent
vs.FromEventPattern
使用FromEventPattern
时,您的活动型EventHandler
或通用EventHandler<T>
.使用FromEvent
时,您使用的是定制的,非通用事件处理程序类型.以下示例直接从Rx wiki中提取,其中包含许多很好的示例- 其中101个是准确的.
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
显然,新语法有所改变.目前的语法如下:
// 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();
Run Code Online (Sandbox Code Playgroud)