Observable.FromEvent 대신 Observable.FromEventPattern을 언제 사용합니까?
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);
호출 response.Subscribe(...)
하면 System.ArgumentException "대상 메서드에 바인딩 오류가 발생했습니다."
나는 그것을 작동시킬 수 Observable.FromEventPattern<EMSMessageEventArgs>(msgConsumer, "MessageHandler")
있지만 이벤트가 문자열로 있고 깨끗하지 않습니다.
또한 나는이 IObservable<EventPattern<EMSMessageEventArgs>>
아닌IObservable<EMSMessageEventArgs>
내가 이해하고 싶은 것은 : 내가 사용해야 할 때 FromEvent
이상 FromEventPattern
? 약간 시행 착오 인 것 같습니다.
"이벤트에 FromEvent를 사용하는 것은 구조적으로 .NET 이벤트 패턴처럼 보이지 않으며 (즉, 보낸 사람, 이벤트 인수를 기반으로하지 않음) 패턴 기반 패턴에 대해 FromEventPattern을 사용합니다." - 바트 드 스멧 (수신 팀)
이에 대해 좀 더 자세히 설명하기 위해 일반적으로 관찰하려는 클래스에서 사용되는 이벤트 유형에 따라 FromEvent
vs 중 하나를 선택할시기를 결정할 수 있습니다 FromEventPattern
. 사용 FromEventPattern
이벤트 유형의 경우 EventHandler
또는 일반 EventHandler<T>
. FromEvent
제네릭이 아닌 사용자 지정 이벤트 처리기 유형을 사용할 때 사용 합니다. 다음 예제는 Rx 위키 에서 직접 가져온 것 입니다 . 여기에는 좋은 예제가 많이 있습니다 (정확히 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 );
}
}
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);
}
}
분명히 새 구문이 약간 변경되었습니다. 현재 구문은 다음과 같습니다.
// 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();
'IT이야기' 카테고리의 다른 글
익명 유형 동적 생성 (0) | 2021.04.30 |
---|---|
"git rebase origin"vs. "git rebase origin / master" (0) | 2021.04.30 |
Os.Rename에서 강제 덮어 쓰기 (0) | 2021.04.30 |
set_time_limit ()와 ini_set ( 'max_execution_time',…)의 차이점 (0) | 2021.04.30 |
Rust에서 HTTP 요청 (0) | 2021.04.29 |