отписка от обрабочика события лямбда-выражения
От: sergunok  
Дата: 30.10.10 07:11
Оценка:
Скажите, а возможно ли отписаться от обработчика события, описанного в виде лямбда-выражения, в самом этом лямбда-выражении?

т.е. хочется что-то вроде:



void f(X x)
{
Action a=  
() =>
{
// some code
x.Stopped -= a;
};
x.Stopped += a;
}


Проблема в том, что тут "x.Stopped -= a" сам a еще не инициализирован.
Re: отписка от обрабочика события лямбда-выражения
От: Jolly Roger  
Дата: 30.10.10 07:16
Оценка:
Здравствуйте, sergunok, Вы писали:

S>void f(X x)
S>{
S>Action a=  null;
S>a = () =>
S>{
S>// some code
S>x.Stopped -= a;
S>};
S>x.Stopped += a;
"Нормальные герои всегда идут в обход!"
Re[2]: отписка от обрабочика события лямбда-выражения
От: sergunok  
Дата: 30.10.10 07:32
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, sergunok, Вы писали:


JR>
S>>void f(X x)
S>>{
S>>Action a=  null;
S>>a = () =>
S>>{
S>>// some code
S>>x.Stopped -= a;
S>>};
S>>x.Stopped += a;
JR>


Про "нормальных героев" — это намек на отдельную функцию обработчик, принимающую x в виде параметра?
Re[3]: отписка от обрабочика события лямбда-выражения
От: Jolly Roger  
Дата: 30.10.10 07:52
Оценка: 2 (1)
Здравствуйте, sergunok, Вы писали:

S>Здравствуйте, Jolly Roger, Вы писали:


JR>>Здравствуйте, sergunok, Вы писали:


JR>>
S>>>void f(X x)
S>>>{
S>>>Action a=  null;
S>>>a = () =>
S>>>{
S>>>// some code
S>>>x.Stopped -= a;
S>>>};
S>>>x.Stopped += a;
JR>>


S>Про "нормальных героев" — это намек на отдельную функцию обработчик, принимающую x в виде параметра?


Нет, это намёк на то, что если крепость нельзя взять в лоб, то всегда найдётся способ подсунуть в неё торянского коня

По сути, это ошибка компилятора, так как на момент вызова лямбды переменная "a" вполне себе инициализирована. Значит, надо просто "успкоить" компилятор, разбив строку
Action a= () =>...
на две части

Action a=  null; // "инициализируем" a значением null
a = () => {x.Stopped -= a} спокойно используем a


Так понятнее?
"Нормальные герои всегда идут в обход!"
Re[4]: отписка от обрабочика события лямбда-выражения
От: sergunok  
Дата: 30.10.10 08:11
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, sergunok, Вы писали:


S>>Здравствуйте, Jolly Roger, Вы писали:


JR>>>Здравствуйте, sergunok, Вы писали:


JR>>>
S>>>>void f(X x)
S>>>>{
S>>>>Action a=  null;
S>>>>a = () =>
S>>>>{
S>>>>// some code
S>>>>x.Stopped -= a;
S>>>>};
S>>>>x.Stopped += a;
JR>>>


S>>Про "нормальных героев" — это намек на отдельную функцию обработчик, принимающую x в виде параметра?


JR>Нет, это намёк на то, что если крепость нельзя взять в лоб, то всегда найдётся способ подсунуть в неё торянского коня


JR>По сути, это ошибка компилятора, так как на момент вызова лямбды переменная "a" вполне себе инициализирована. Значит, надо просто "успкоить" компилятор, разбив строку

JR>Action a= () =>...
JR>на две части

JR>
JR>Action a=  null; // "инициализируем" a значением null
JR>a = () => {x.Stopped -= a} спокойно используем a
JR>


JR>Так понятнее?


Клево. Меня что-то переклинило по-началу, решил, что тут "x.Stopped -= a;" a будет "замкнут" как a= null, но все ок. Спасибо!
Re: отписка от обрабочика события лямбда-выражения
От: TK Лес кывт.рф
Дата: 30.10.10 18:19
Оценка:
Здравствуйте, sergunok, Вы писали:

S>Скажите, а возможно ли отписаться от обработчика события, описанного в виде лямбда-выражения, в самом этом лямбда-выражении?

S>т.е. хочется что-то вроде:

Сделайте хелпер:
            SubscribeHelper<EventArgs>.Subscribe
                (
                    source, 
                    (sender, eventData) =>
                    {
                        // TODO: Code
                    },
                    (obj, handler) => obj.SomeEvent += handler,
                    (obj, handler) => obj.SomeEvent -= handler
                );


Из плюсов — будет гарантированная отписка по выполнению основного действия независимо от того произошло исключение или нет.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.