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

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

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

obj.event += h;
...
Рейтинг: 0 / 0
Евенты и лямба выражения.
    #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
Евенты и лямба выражения.
    #37131394
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мы не ищем легких путей? :)

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

Мне просто выдало сообщение, типа: "локальная переменная не задана". Увидел ошибку и подумал что так нельзя и стер код, особо не вчитывался в ошибку)
...
Рейтинг: 0 / 0
Евенты и лямба выражения.
    #37131868
Фотография 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
Евенты и лямба выражения.
    #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
Евенты и лямба выражения.
    #37131945
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Еще вариант - через триггер на событие OnCompleted и вызов акции
...
Рейтинг: 0 / 0
Евенты и лямба выражения.
    #37132042
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iдля событий есть специально обученный метод
Код: plaintext
1.
           .Take(1) //Отписываемся сразу после первого события;
чудесно! а если необходимо отфильтровать "нужное" событие, то перед Take можно вставить Where
(спасибо, СеВа, за участие :)

но вот если издателя нужно "инициировать" какими-то данными (передать используемый в порождении события параметр), то придется городить что-то наподобие PushOnceMethod с входящим параметром (к задаче автора, правда, это не относится)
...
Рейтинг: 0 / 0
Евенты и лямба выражения.
    #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
Евенты и лямба выражения.
    #37132936
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iСила rx в том, что он позволяет делать оркестровку с помощью linq запросов.
Задача топикстартера легко решается написанием удобного расширяющего метода на базе решения от Вестник . И никаких левых библиотек для этого тянуть в проект не надо. Отсилы - десяток строк кода.

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

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

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

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

Оно ?
...
Рейтинг: 0 / 0
Евенты и лямба выражения.
    #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
16 сообщений из 16, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Евенты и лямба выражения.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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