Reactive Extensions FromEvent от события не EventHanler.
От: Аноним  
Дата: 09.02.11 20:14
Оценка:
хотелось бы получить IObservable от события которое несовместимо с EventHandler.(Делегат с 3 параметрами)
Как это сделать?
Re: Reactive Extensions FromEvent от события не EventHanler.
От: Петрухин Эдуард Россия  
Дата: 09.02.11 21:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>хотелось бы получить IObservable от события которое несовместимо с EventHandler.(Делегат с 3 параметрами)

А>Как это сделать?
delegate void MyDelegateType(int val1, string val2, double val3);

class MyEventArgs : EventArgs
{
    public int Value1 { get; private set; }
    public string Value2 { get; private set; }
    public double Value3 { get; private set; }

    public MyEventArgs(int val1, string val2, double val3)
    {
        Value1 = val1;
        Value2 = val2;
        Value3 = val3;
    }
}

class Foo
{
    // ...
    public event MyDelegateType BarEvent;
    // ...
}

class Program
{
    public static void Main()
    {
        var foo = new Foo();

        var observable = Observable.FromEvent<MyDelegateType, MyEventArgs>(
            eventHandler => (val1, val2, val3) => eventHandler(foo, new MyEventArgs(val1, val2, val3)),
            myDelegateTypeHandler => foo.BarEvent += myDelegateTypeHandler,
            myDelegateTypeHandler => foo.BarEvent -= myDelegateTypeHandler);
    }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1302>>
Re[2]: Reactive Extensions FromEvent от события не EventHanl
От: Аноним  
Дата: 10.02.11 06:46
Оценка:
Спасибо за ответ. А без EventArgs нельзя никак? не хотелось бы плодить эти классы... которые собственно говоря не нужны,..

Здравствуйте, Петрухин Эдуард, Вы писали:
Re[3]: Reactive Extensions FromEvent от события не EventHanl
От: Пельмешко Россия blog
Дата: 10.02.11 07:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо за ответ. А без EventArgs нельзя никак? не хотелось бы плодить эти классы... которые собственно говоря не нужны,..


Ну нужно же как-то представить параметры делегата в виде единой сущности.
Или у Вас тип делегата с одним параметром? Приведите определение типа делегата плз.
Re[4]: Reactive Extensions FromEvent от события не EventHanl
От: Аноним  
Дата: 10.02.11 12:10
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Аноним, Вы писали:


А>>Спасибо за ответ. А без EventArgs нельзя никак? не хотелось бы плодить эти классы... которые собственно говоря не нужны,..


П>Ну нужно же как-то представить параметры делегата в виде единой сущности.

П>Или у Вас тип делегата с одним параметром? Приведите определение типа делегата плз.

Все я понял в чем мое заблуждение... Нам нужен объект который будет передан в onNext... мы не можем туда передать 2-3-4 объекта как параметра..
и как следствие непонятно как их извлечь в lINQ запросе.. Правильно?
Re[5]: Reactive Extensions FromEvent от события не EventHanl
От: Петрухин Эдуард Россия  
Дата: 10.02.11 13:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Все я понял в чем мое заблуждение... Нам нужен объект который будет передан в onNext... мы не можем туда передать 2-3-4 объекта как параметра..

А>и как следствие непонятно как их извлечь в lINQ запросе.. Правильно?

Правильно. Нужно как-то объединить параметры делегата в один объект. Если не хочешь писать наследника от EventArgs, можно воспользоваться, например, классом «Tuple»:

delegate void MyDelegateType(int val1, string val2, double val3);

class Foo
{
    // ...
    public event MyDelegateType BarEvent;
    // ...
}

private static void ProgramCode()
{
    var foo = new Foo();

    var observable = Observable.Create<Tuple<int, string, double>>(
        observer =>
            {
                MyDelegateType handler = (val1, val2, val3) => observer.OnNext(Tuple.Create(val1, val2, val3));
                foo.BarEvent += handler;
                return () => foo.BarEvent -= handler;
            });
}
Re[6]: Reactive Extensions FromEvent от события не EventHanl
От: Аноним  
Дата: 10.02.11 14:44
Оценка:
А какая кстати практика с освобождением объектов которые получаются после Subscribe?
их выносят например в поля формы и потом убивают в Dispose формы?

ПЭ>class Foo

ПЭ>{
ПЭ> // ...
ПЭ> public event MyDelegateType BarEvent;
ПЭ> // ...
ПЭ>}

ПЭ>private static void ProgramCode()

ПЭ>{
ПЭ> var foo = new Foo();

ПЭ> var observable = Observable.Create<Tuple<int, string, double>>(

ПЭ> observer =>
ПЭ> {
ПЭ> MyDelegateType handler = (val1, val2, val3) => observer.OnNext(Tuple.Create(val1, val2, val3));
ПЭ> foo.BarEvent += handler;
ПЭ> return () => foo.BarEvent -= handler;
ПЭ> });
ПЭ>}
ПЭ>[/c#]
Re[7]: Reactive Extensions FromEvent от события не EventHanl
От: Петрухин Эдуард Россия  
Дата: 10.02.11 18:54
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А какая кстати практика с освобождением объектов которые получаются после Subscribe?

А>их выносят например в поля формы и потом убивают в Dispose формы?

Если использовать Rx для обработки событий, то отписываться надо там же, где бы ты отписывался от событий.
Я обычно все подписки собираю в CompositeDisposable и отписываюсь от всего скопом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1302>>
Re[8]: Reactive Extensions FromEvent от события не EventHanl
От: Аноним  
Дата: 10.02.11 20:04
Оценка:
ПЭ>Если использовать Rx для обработки событий, то отписываться надо там же, где бы ты отписывался от событий.
ПЭ>Я обычно все подписки собираю в CompositeDisposable и отписываюсь от всего скопом.

Какие еще сценарии используются?
Пока самое очевидное это события события + события...
Re[9]: Reactive Extensions FromEvent от события не EventHanl
От: Аноним  
Дата: 12.02.11 08:11
Оценка:
Здравствуйте, Аноним, Вы писали:


ПЭ>>Если использовать Rx для обработки событий, то отписываться надо там же, где бы ты отписывался от событий.

ПЭ>>Я обычно все подписки собираю в CompositeDisposable и отписываюсь от всего скопом.

А>Какие еще сценарии используются?

А>Пока самое очевидное это события события + события...

Up. если возможно поделитесь практиками использования и сценариями..
За исключеним обработки событий и обработки асинхронных операций.
Re[10]: Reactive Extensions FromEvent от события не EventHan
От: Петрухин Эдуард Россия  
Дата: 13.02.11 16:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>>Какие еще сценарии используются?

А>>Пока самое очевидное это события события + события...

А>Up. если возможно поделитесь практиками использования и сценариями..

А>За исключеним обработки событий и обработки асинхронных операций.

Мы используем Rx как замену/дополнение к событиям, но не к событиям UI контролов, а к внутренним событиям приложения; используем для работы с таймерами; используем для прокидывания событий в UI поток.

Например:
1. Есть данные для отображения на UI (во ViewModel).
2. Есть фильтр (в другой ViewModel), который эти данные фильтрует.
3. Есть справочник с настройками для каждого дня недели, в нём определяется в каком порядке и с каким оформлением эти данные выводить на UI.
4. Есть настройка, определяющая начало дня (например, 06:00 значит что понедельник в нашем приложении начинается в 6 утра понедельника, а 5 утра понедельника — это всё ещё воскресенье )

Задача состоит в том чтобы показать отфильтрованные данные с учётом текущего дня недели. Фильтр может поменяться, могут поменятся данные в справочнике, тикает время, могут поменять время начала дня в настройках. Все эти изменяемые вещи выражены через Observable. ViewModel на них подписывается, фильтрует (Where, DistinctUntilChanged), преобразует (Select), аггрегирует (Aggregate), объединяет (Merge), прокидывает в UI поток (ObserveOn). На выходе — данные, которые биндятся на UI.
... << RSDN@Home 1.2.0 alpha 4 rev. 1302>>
Re[11]: Reactive Extensions FromEvent от события не EventHan
От: Аноним  
Дата: 13.02.11 17:14
Оценка:
ПЭ>Задача состоит в том чтобы показать отфильтрованные данные с учётом текущего дня недели. Фильтр может поменяться, могут поменятся данные в справочнике, тикает время, могут поменять время начала дня в настройках. Все эти изменяемые вещи выражены через Observable. ViewModel на них подписывается, фильтрует (Where, DistinctUntilChanged), преобразует (Select), аггрегирует (Aggregate), объединяет (Merge), прокидывает в UI поток (ObserveOn). На выходе — данные, которые биндятся на UI.

у меня нечто подобное... только я хочу комбинировать события идущие от COM сервера...
Но проблема что он не многопоточный. И надо днелать все в том же потоке что и COM.
Я так понимаю если я сделаю FromEvent,Subscribe и потом напишу LINQ запрос который к примеру не содержит Throttle то я с большой вероятностью останусь в том же потоке в котором сделал subscribe... но если я с делаю что то типа Throttle или delay... то все я буду в другом потоке который менеджит RX...
Re[12]: Reactive Extensions FromEvent от события не EventHan
От: Петрухин Эдуард Россия  
Дата: 13.02.11 20:29
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Но проблема что он не многопоточный. И надо днелать все в том же потоке что и COM.

А>Я так понимаю если я сделаю FromEvent,Subscribe и потом напишу LINQ запрос который к примеру не содержит Throttle то я с большой вероятностью останусь в том же потоке в котором сделал subscribe... но если я с делаю что то типа Throttle или delay... то все я буду в другом потоке который менеджит RX...

Смотри в сторону IScheduler и методов ObserveOn/SubscribeOn. С их помощью ты сможешь выполнять подписку на события и их обработку в том потоке, в котором захочешь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1302>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.