Критические изменения сломали образцы Rx - PullRequest
2 голосов
/ 06 января 2012

Есть несколько примеров из 101 Rx Samples из Rx Wiki, которые на самом деле больше не работают. Я думаю, это потому, что у меня последняя версия Rx (1.0.10621.2), но я хотел бы подтвердить и посмотреть, как я могу заставить их работать.

Например, следующий пример кода не работает:

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» вызывает ошибку «Невозможно неявно преобразовать тип System.Action<xxx> в System.EventHandler<xxx>».

Ответы [ 3 ]

3 голосов
/ 07 января 2012

Метод расширения FromEvent был переименован в FromEventPattern, поэтому сделайте это, и сэмплы должны работать 101.

Смущает то, что для нестандартных событий была создана новая перегрузка FromEvent.,Они должны были назвать это FromEventAction, но они не сделали.

3 голосов
/ 06 января 2012

У вас есть несколько вариантов в этом случае.Первый заключается в предоставлении делегата, который соответствует стандартному шаблону EventHandler (результирующая наблюдаемая имеет тип IObservable<SomeEventArgs>).Обратите внимание, что предоставленная мной лямда принимает "o" ("отправитель"), но этот параметр не используется:

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

Особенно в вашей ситуации (статическое событие ... yikes!), Я быбудьте осторожны, полагая, что отмена подписки действительно очистит должным образом, и вы можете получить неприятную утечку памяти в зависимости от использования.В качестве альтернативы вы можете указать тип делегата.Обратите внимание, что дополнительный универсальный параметр для FromEvent

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

Еще одна альтернатива, которая перемещает обработку объекта источника / отправителя в Observer (делая наблюдаемый типа IObservable<EventPattern<SomeEventArgs>>), заключается в использовании FromEventPattern метод.У меня были небольшие проблемы с этим методом в некоторых сборках, поэтому ваш пробег может отличаться, но вот альтернатива:

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

Надеюсь, это немного поможет.

0 голосов
/ 08 августа 2012

Множество примеров из Программирование реактивных расширений и LINQ Джесси Либерти и Пола Беттса книга сломана :( :( Это так грустно ...

...