Здравствуйте, <Аноним>, Вы писали:
А>хотелось бы получить 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
Здравствуйте, Аноним, Вы писали:
А>Спасибо за ответ. А без EventArgs нельзя никак? не хотелось бы плодить эти классы... которые собственно говоря не нужны,..
Ну нужно же как-то представить параметры делегата в виде единой сущности.
Или у Вас тип делегата с одним параметром? Приведите определение типа делегата плз.
Re[4]: Reactive Extensions FromEvent от события не EventHanl
От:
Аноним
Дата:
10.02.11 12:10
Оценка:
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, Аноним, Вы писали:
А>>Спасибо за ответ. А без EventArgs нельзя никак? не хотелось бы плодить эти классы... которые собственно говоря не нужны,..
П>Ну нужно же как-то представить параметры делегата в виде единой сущности. П>Или у Вас тип делегата с одним параметром? Приведите определение типа делегата плз.
Все я понял в чем мое заблуждение... Нам нужен объект который будет передан в onNext... мы не можем туда передать 2-3-4 объекта как параметра..
и как следствие непонятно как их извлечь в lINQ запросе.. Правильно?
Re[5]: Reactive Extensions FromEvent от события не EventHanl
Здравствуйте, Аноним, Вы писали:
А>Все я понял в чем мое заблуждение... Нам нужен объект который будет передан в onNext... мы не можем туда передать 2-3-4 объекта как параметра.. А>и как следствие непонятно как их извлечь в lINQ запросе.. Правильно?
Правильно. Нужно как-то объединить параметры делегата в один объект. Если не хочешь писать наследника от EventArgs, можно воспользоваться, например, классом «Tuple»:
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
Здравствуйте, <Аноним>, Вы писали:
А>А какая кстати практика с освобождением объектов которые получаются после 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
Здравствуйте, <Аноним>, Вы писали:
А>>Какие еще сценарии используются? А>>Пока самое очевидное это события события + события...
А>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
Здравствуйте, <Аноним>, Вы писали:
А>Но проблема что он не многопоточный. И надо днелать все в том же потоке что и COM. А>Я так понимаю если я сделаю FromEvent,Subscribe и потом напишу LINQ запрос который к примеру не содержит Throttle то я с большой вероятностью останусь в том же потоке в котором сделал subscribe... но если я с делаю что то типа Throttle или delay... то все я буду в другом потоке который менеджит RX...
Смотри в сторону IScheduler и методов ObserveOn/SubscribeOn. С их помощью ты сможешь выполнять подписку на события и их обработку в том потоке, в котором захочешь.