2012-01-06 3 views
2

Rx Wiki의 101 Rx Samples에서 실제로 작동하지 않는 샘플이 몇 가지 있습니다. Rx 최신 버전 (1.0.10621.2)이 있지만 작동 확인 방법을 확인하고 싶습니다.깨는 변경 사항으로 Rx 샘플이 깨졌습니다.

예를 들어, 다음 예제 코드가 작동하지 않습니다

class ObserveEvent_Generic 
{ 
    public class SomeEventArgs : EventArgs { } 
    public static event EventHandler<SomeEventArgs> GenericEvent; 

    static void Main() 
    { 
     // To consume GenericEvent as an IObservable: 
     IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent<SomeEventArgs>(
      ev => GenericEvent += ev, 
      ev => GenericEvent -= ev); 
    } 
} 

을 IEvent가와 "EV => GenericEvent + = EV"a "는 암시 적으로 형에게 System.Action<xxx> 오류 System.EventHandler<xxx>에 변환 할 수 없습니다 원인이 없습니다.

답변

3

첫 번째는 표준 EventHandler 패턴과 일치하는 대리인을 제공하는 것입니다 (결과 Observable은 IObservable<SomeEventArgs> 유형 임). 제공 한 lamda가 "o"("보낸 사람"),이 매개 변수는 사용되지 않습니다.

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<SomeEventArgs> 
(
    ev => GenericEvent += (o,e) => ev(e), 
    ev => GenericEvent -= (o,e) => ev(e) 
); 

특히 상황에서 (정적 이벤트는 ... 이궁!), 나는 구독 취소가 진정으로 정리 제대로 사용 현황에 따라 불쾌한 메모리 누수로 끝날 수있는 것이라고 신뢰하는 말이 될 것이다. 또는 델리게이트 유형을 지정할 수 있습니다. 여기 FromEvent

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<EventHandler<SomeEventArgs>, SomeEventArgs> 
(
    ev => GenericEvent += ev, 
    ev => GenericEvent -= ev 
); 

(유형 IObservable<EventPattern<SomeEventArgs>>의 관찰을) 옵저버에 소스/보낸 개체의 처리를 이동하는 또 하나 개의 대안 여분의 일반적인 매개 변수를 주목하는 것은 FromEventPattern 방법을 사용하는 것입니다. 일부 빌드에서 나는이 방법에 약간 문제가 있었다, 그래서 귀하의 마일리지가 다를 수 있지만, 여기에 대안입니다 :

IObservable<EventPattern<SomeEventArgs>> eventAsObservable = 
Observable.FromEventPattern<SomeEventArgs> 
(
    ev => GenericEvent += ev, 
    ev => GenericEvent -= ev 
); 

는 희망이 조금 도움이됩니다.

3

FromEvent 확장 방법이 FromEventPattern으로 변경되었으므로 101 샘플이 작동해야합니다.

비표준 이벤트에 대해 새로운 FromEvent 오버로드가 작성되었다는 것이 혼란 스럽습니다. 그들은 FromEventAction이라고 불러야했지만 그렇지 않았습니다.

관련 문제