Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Евенты и лямба выражения. / 16 сообщений из 16, страница 1 из 1
22.02.2011, 16:30
    #37130862
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Необходимо назначить евент, а потом, по срабатыванию евента, удалить его. Что бы лишний раз не вызывался. Как это сделать? Учитывая то, что обработчик евента задаю через лямбду. Можно конечно отказаться от использования лямбды, но это реально удобная штука.

Код: plaintext
1.
2.
3.
4.
5.
widthStoryboard.Completed += new EventHandler((o, ea) =>
{
    UpdateSize();
    // тут удалить обработчик
});
widthStoryboard.Begin();
...
Рейтинг: 0 / 0
22.02.2011, 17:01
    #37130976
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
компилятор генерит для кажной лямбды отдельную анонимную ф-цию, даже если их несколько идентичных написать
(это я где-то читал, сейчас уже не вспомню где)

а чтобы отминусовать то что Вы приплюсовали, надо указать - что именно отминусовывать
а указать нечего
получается - никак
...
Рейтинг: 0 / 0
22.02.2011, 17:17
    #37131019
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
EventHandler h = null;
h = (s, e) => 
{
    obj.event -= h;
    DoSomething();
};

obj.event += h;
...
Рейтинг: 0 / 0
22.02.2011, 17:39
    #37131076
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Вестник,

Точно! Чет я протупил.

Но можно еще так:
Код: plaintext
1.
2.
3.
4.
5.
widthStoryboard.Completed += new EventHandler((o, ea) =>
{
    UpdateSize();
    widthStoryboard.Completed -= (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), this, System.Reflection.MethodInfo.GetCurrentMethod().Name);
});
widthStoryboard.Begin();
...
Рейтинг: 0 / 0
22.02.2011, 21:56
    #37131394
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
мы не ищем легких путей? :)

на самом деле то решение, которое я предложил, автоматически приходит на ум, если вы хоть раз пытались написать программу, которая выводит сама себя
...
Рейтинг: 0 / 0
22.02.2011, 23:27
    #37131467
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Вестник,

Мне просто выдало сообщение, типа: "локальная переменная не задана". Увидел ошибку и подумал что так нельзя и стер код, особо не вчитывался в ошибку)
...
Рейтинг: 0 / 0
23.02.2011, 11:33
    #37131868
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
что-то СеВа отлынивает, поработаю за него =))
с помощью Rx все это дело (подписку/отписку) можно снести на издателя, типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
public IObservable<IEvent<EventArgs>> PushOnceMethod()
{
    return Observable.Create<IEvent<EventArgs>>(observer => {
        EventHandler<EventArgs> handler = (sender, args) => { observer.OnNext(Event.Create(sender, args)); observer.OnCompleted(); };
        MyEvent += handler;
        return () => MyEvent -= handler;
    });
}
и тогда у на подписчике
Код: plaintext
publisher.PushOnceMethod().Subscribe(evt => {...evt.EventArgs...}/*через лямбду*/);
...
Рейтинг: 0 / 0
23.02.2011, 12:27
    #37131930
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
LRчто-то СеВа отлынивает, поработаю за него =))
с помощью Rx все это дело (подписку/отписку) можно снести на издателя, типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
public IObservable<IEvent<EventArgs>> PushOnceMethod()
{
    return Observable.Create<IEvent<EventArgs>>(observer => {
        EventHandler<EventArgs> handler = (sender, args) => { observer.OnNext(Event.Create(sender, args)); observer.OnCompleted(); };
        MyEvent += handler;
        return () => MyEvent -= handler;
    });
}
и тогда у на подписчике
Код: plaintext
publisher.PushOnceMethod().Subscribe(evt => {...evt.EventArgs...}/*через лямбду*/);


Молодец, только для событий есть специально обученный метод
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
IObservable<IEvent<EventArgs>> observableStoryboard = Observable.FromEvent(
           handler =>  widthStoryboard.Completed += handler, 
           handler =>  widthStoryboard.Completed -= handler)
           .Take(1) //Отписываемся сразу после первого события;

observableStoryboard.Subscribe(args => UpdateSize());

widthStoryboard.Begin();

...
Рейтинг: 0 / 0
23.02.2011, 12:33
    #37131945
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Еще вариант - через триггер на событие OnCompleted и вызов акции
...
Рейтинг: 0 / 0
23.02.2011, 13:32
    #37132042
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
iдля событий есть специально обученный метод
Код: plaintext
1.
           .Take(1) //Отписываемся сразу после первого события;
чудесно! а если необходимо отфильтровать "нужное" событие, то перед Take можно вставить Where
(спасибо, СеВа, за участие :)

но вот если издателя нужно "инициировать" какими-то данными (передать используемый в порождении события параметр), то придется городить что-то наподобие PushOnceMethod с входящим параметром (к задаче автора, правда, это не относится)
...
Рейтинг: 0 / 0
23.02.2011, 19:27
    #37132567
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
LRно вот если издателя нужно "инициировать" какими-то данными (передать используемый в порождении события параметр), то придется городить что-то наподобие PushOnceMethod с входящим параметром (к задаче автора, правда, это не относится)

Сила rx в том, что он позволяет делать оркестровку с помощью linq запросов.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var obs= 
           from args in  Observable.FromEvent(
           handler =>  widthStoryboard.Completed += handler, 
           handler =>  widthStoryboard.Completed -= handler)
           from e in ....
           let res = new{E =e, Arg = args}
           from c in Observable.Return( new MyClass(...)) 
           from m in c.Method1.ToAsync()
           from res in m(z,res)
           from r in 
           .....
           select res, r
...
Рейтинг: 0 / 0
24.02.2011, 07:01
    #37132936
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
iСила rx в том, что он позволяет делать оркестровку с помощью linq запросов.
Задача топикстартера легко решается написанием удобного расширяющего метода на базе решения от Вестник . И никаких левых библиотек для этого тянуть в проект не надо. Отсилы - десяток строк кода.

Пока не будет удобного решения через Rx для хотя бы этой задачи - всё это не более чем игрушка для реализации драгэнддропа.
...
Рейтинг: 0 / 0
24.02.2011, 09:05
    #37132984
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Алексей КiСила rx в том, что он позволяет делать оркестровку с помощью linq запросов.
Задача топикстартера легко решается написанием удобного расширяющего метода на базе решения от Вестник . И никаких левых библиотек для этого тянуть в проект не надо. Отсилы - десяток строк кода.

Пока не будет удобного решения через Rx для хотя бы этой задачи - всё это не более чем игрушка для реализации драгэнддропа.

удобных решений для бредовых задач не бывает
...
Рейтинг: 0 / 0
24.02.2011, 10:44
    #37133166
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
iудобных решений для бредовых задач не бываетПоследовательно выполнить несколько методов вебсервиса - бредовая задача? Ну не знаю...
...
Рейтинг: 0 / 0
24.02.2011, 13:52
    #37133657
Руки-крюки
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Алексей КiСила rx в том, что он позволяет делать оркестровку с помощью linq запросов.
Задача топикстартера легко решается написанием удобного расширяющего метода на базе решения от Вестник . И никаких левых библиотек для этого тянуть в проект не надо. Отсилы - десяток строк кода.

Пока не будет удобного решения через Rx для хотя бы этой задачи - всё это не более чем игрушка для реализации драгэнддропа.

Оно ?
...
Рейтинг: 0 / 0
24.02.2011, 14:49
    #37133789
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Евенты и лямба выражения.
Руки-крюкиАлексей Кпропущено...

Задача топикстартера легко решается написанием удобного расширяющего метода на базе решения от Вестник . И никаких левых библиотек для этого тянуть в проект не надо. Отсилы - десяток строк кода.

Пока не будет удобного решения через Rx для хотя бы этой задачи - всё это не более чем игрушка для реализации драгэнддропа.

Оно ?
В той ветке я показывал, как делается последовательный вызов нескольких сервисов.
Вызов с условиями можно делать кучей способов.
Есть оператор If..Then, но можно и без него
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
namespace RxText
{
     class Program
    {
        
         public static IEnumerable<IObservable<int>> GetCoroutines(bool condition)
        {
           yield return Observable.Start(() =>
                                              {
                                                  Console.WriteLine   (Thread.CurrentThread.ManagedThreadId.ToString());
                                                  Thread.Sleep(1000);
                                                  return 1;
                                              });
    if (condition)
        yield return Observable.Start(() =>
                                              {
                                                  Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
                                                  Thread.Sleep(2000);
                                                  return 2;
                                              });
        }

        static void Main(string[] args)
        {
            var ii = from i in GetCoroutines(true).Concat()
                     select  i * 2;
            ii.Sum().Subscribe(r => Console.WriteLine("if true result="+r.ToString()));
      
            var ii1 = from i in GetCoroutines(true).Concat()
                    select i * 2;
            ii1.Sum().Subscribe(r => Console.WriteLine(("if false result="+r.ToString()));
            Console.ReadKey();
        }
    }
}
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Евенты и лямба выражения. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]