Как правильно подписатся и отписатся от события
От: Аноним  
Дата: 11.02.11 14:05
Оценка:
Подскажите новичку. Вот у меня может возникнуть ситуация когда дважды подписываюсь на событие. Например как-бы рабатывает код
res.BeforeDisConnect += BrokerConnectionBeforeDisConnect;
res.BeforeDisConnect += BrokerConnectionBeforeDisConnect;

Скажите отписыватся надо дважды или достаточно 1 раза? Т.е. достаточно написать так
res.BeforeDisConnect -= BrokerConnectionBeforeDisConnect;

Или надо
res.BeforeDisConnect -= BrokerConnectionBeforeDisConnect;
res.BeforeDisConnect -= BrokerConnectionBeforeDisConnect;
Re: Как правильно подписатся и отписатся от события
От: Sinix  
Дата: 11.02.11 14:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажите отписыватся надо дважды или достаточно 1 раза? Т.е. достаточно написать так

дважды.
Re[2]: Как правильно подписатся и отписатся от события
От: Аноним  
Дата: 14.02.11 07:33
Оценка:
Здравствуйте, Sinix, Вы писали:

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


А>>Скажите отписыватся надо дважды или достаточно 1 раза? Т.е. достаточно написать так

S>дважды.

А как проверить, чтобы небыло подписи раньше? Т.е. как подписатся только один раз?
Re[3]: Как правильно подписатся и отписатся от события
От: Аноним  
Дата: 14.02.11 07:59
Оценка: +1
А>А как проверить, чтобы небыло подписи раньше? Т.е. как подписатся только один раз?
зачем вам это знать.
Кто подписывается тот и отписывается.
Он же знает сколько раз была подпись.
Re[3]: Как правильно подписатся и отписатся от события
От: Sinix  
Дата: 14.02.11 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как проверить, чтобы небыло подписи раньше? Т.е. как подписатся только один раз?

it's up to you

Можно реализовать свою логику подписки/отписки и проверять, чтобы GetInvocationList() не содержал добавляемого подписчика. Только вас ждёт куча сюрпризов аля

    private static event EventHandler Event;

    [STAThread]
    public static void Main(string[] args)
    {
      EventHandler h = (s, e) => Console.WriteLine("Hello!");
      h += (s, e) => Console.WriteLine("Hello again!");
      h += h.Invoke;

      Event += h;
      
      Console.WriteLine(Event.GetInvocationList().Length);
      Event(null, EventArgs.Empty);
    }


Поэтому лучше с самого начала писать код так, чтобы не было необходимости в хаках
Re[3]: Как правильно подписатся и отписатся от события
От: MxMsk Португалия  
Дата: 14.02.11 08:30
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>А как проверить, чтобы небыло подписи раньше? Т.е. как подписатся только один раз?

Например, всегда отписываться перед подпиской. Но пользоваться этим стоит только в случае крайней необходимости.
Re[4]: Как правильно подписатся и отписатся от события
От: Аноним  
Дата: 14.02.11 10:11
Оценка:
А>>А как проверить, чтобы небыло подписи раньше? Т.е. как подписатся только один раз?
MM>Например, всегда отписываться перед подпиской. Но пользоваться этим стоит только в случае крайней необходимости.

Я так счас и делаю. Со временем перепишу тот кусок кода чтобы подобных проблем не появлялось. но счас нету на это времени
Re[4]: Как правильно подписатся и отписатся от события
От: _Raz_  
Дата: 15.02.11 12:18
Оценка:
Здравствуйте, MxMsk, Вы писали:

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


Почему только в случае крайней необходимости?
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re[5]: Как правильно подписатся и отписатся от события
От: MxMsk Португалия  
Дата: 15.02.11 14:37
Оценка:
Здравствуйте, _Raz_, Вы писали:

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

_R_>Почему только в случае крайней необходимости?
Потому что зачастую этого не требуется. Зачем тратить время на отписку, если отписывать нечего? Напомню, что до 4-го ДотНета, подписка и отписка от событий, код которых генерировался компилятором, выполнялась внутри блокировки. Сейчас она построена на Interlocked. Поэтому только если реализация никак не позволяет быть уверенным, что не будет повторной подписки, только тогда применим указанный мною метод.
Re[5]: Как правильно подписатся и отписатся от события
От: Sinix  
Дата: 15.02.11 14:54
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>Почему только в случае крайней необходимости?

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