IT이야기

Observable.FromEvent 대신 Observable.FromEventPattern을 사용

cyworld 2021. 4. 30. 21:46
반응형

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을 사용합니다." - 바트 드 스멧 (수신 팀)


이에 대해 좀 더 자세히 설명하기 위해 일반적으로 관찰하려는 클래스에서 사용되는 이벤트 유형에 따라 FromEventvs 중 하나를 선택할시기를 결정할 수 있습니다 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(); 

참조 URL : https://stackoverflow.com/questions/6463459/when-to-use-observable-fromeventpattern-rather-than-observable-fromevent

반응형