Коли слід зареєструвати/скасувати реєстрацію подій/повідомлень

Я дивлюся на події та повідомлення в моєму додатку, але я не впевнений у життєвому циклі їх, і коли ви повинні зареєструватися для них.

На даний момент в конструкторі контролера я зареєструватися для отримання повідомлень (або обробників подій). Я не відмінюю реєстрацію, хоча я вважаю помилкою

For example in this posting: MVVM Messaging vs RaisePropertyChanged it says to deregister on the Unloaded event.

Hwever у моєму застосуванні я використовую елементи керування Telerik (це може статися в інших елементах керування), і у мене є вікно у головному екрані. Коли я відокремлюю екран, і в інший час активації подій Unloaded та Loaded відбуваються навіть тоді, коли самі вікна, здається, не закриваються.

Тому, якщо я скасую реєстрацію в Unloaded , то це спричинить проблему. Отже, в який момент я повинен це робити?

0

2 Відповіді

Загалом, я згоден з відповіддю з D .. , але існують деякі випадки, коли обробник події Loaded і Unloaded викликає кілька разів. Я виправляю цю проблему, додаючи змінну bool для перевірки перед реєстрацією.

Прикладний код:

bool _hasRegistered;//default value is false

OnLoaded()
{
    //
    if (!this._hasRegistered)
    {
       //your register code here
        this._hasRegistered = true;
    }
}

OnUnloaded()
{
   //your un-register code here
}
2
додано
Гарна ідея. Іноді найпростіші речі втечу від мене.
додано Автор Jay, джерело

Взагалі кажучи, я відмінюю реєстрацію подій, як тільки я знаю, що вони більше не актуальні, що може змінюватися. Якщо відбувається вивантаження, і поки вікно залишається, то має сенс, що навантаження теж відбувається (як ви вже згадували). У такому разі, можливо, ви повинні зареєструвати їх у завантаженні та відписати їх в розвантаження. Це має гарантувати відповідність. Я не бачу кращої події, ніж розвантаження, яку ви можете використовувати, якщо вам це потрібно для терміну служби userControl/сторінки.

2
додано
Я не впевнений, що генерує вашу подію, але якщо за її межами ви можете зареєструвати його за межами і викликати метод всередині. Якщо елемент, який ця подія є частиною, знаходиться в цьому контрольній/сторінки, то з ними не повинно бути ніяких проблем, оскільки вони повинні бути знищені під час керування (хоча я намагаюся відмовитися від реєстрації щось, що я реєструю). Однак у всьому це не відповідає на ваше запитання :(
додано Автор Jay, джерело
Яку подію ви реєструєте? Як те, що це пов'язано? Я не можу не подумати, що якщо його пов'язано з чим-небудь безпосередньо на своєму вікні/сторінці/керуванню, що воно не може спрацювати під час його завантаження. (наприклад, контроль)
додано Автор Jay, джерело
Я беру назад те, що я сказав раніше. Якщо річ, яка публікує подію для прийому з сервера XMPP, є живим, коли ваше вікно/контроль повністю закриває обробники подій, поки цей об'єкт не вийде з обсягу і зібрав сміття. Чи підтримуєте ви список існуючих відкритих вікон? Якщо це так, я думаю, вам доведеться перемістити реєстрацію та скасування реєстрації подій на методи, які обробляють відстеження самих вікон.
додано Автор Jay, джерело
Проблема, яку я передбачаю в цьому, полягає в тому, що в секундному розділі, що події зняті з реєстрації, можна було б підняти і пропустити.
додано Автор Firedragon, джерело
Це буде повідомлення, відправлене з сервера XMPP, і воно може пожежати, поки воно знову завантажується на жаль
додано Автор Firedragon, джерело