Eventhandlers и объекты времени жизни приложения в c # - я должен отцепить? - PullRequest
7 голосов
/ 22 ноября 2010

Скажем, у меня есть объект, который существует на время приложения.Давайте назовем это GlobalWorker.У GlobalWorker есть события, например UserLoggedIn, на которые могут подписаться другие объекты.Теперь представьте, что у меня есть страница Silverlight или страница asp.net или что-то еще, что подписывается на событие UserLoggedIn, когда оно создается.

public SomePage()
{
GlobalWorker.Instance.UserLoggedIn += new EventHandler(OnUserLoggedIn);
}

private void OnLoggedIn(object sender, EventArgs e)
{

}

Предотвращает ли существование этого события сбор мусора на странице?Если да, то какой шаблон лучше использовать в этом случае: слабые обработчики событий, переместить подписку в событие Load и отписаться в событии UnLoad?

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Использование Слабые события .

Это распространенная проблема в WPF, и хорошо, что вы об этом подумали.

1 голос
/ 22 ноября 2010

Да, поведение не позволяет странице быть GC.

Причина в том, что UserLoggedIn будет хранить ссылку на SomePage в течение неопределенного времени.Явного удаления обработчика не существует, и поскольку слабые события не используются, он также не будет удален неявно.

Вы можете использовать слабые события в качестве другого заявителя, вы также можете повторно- в некоторой степени продумайте свой дизайн и посмотрите, сможете ли вы функционализировать или инкапсулировать поведение событий.Возможно, данные - это все, что должно быть глобальным в этом случае (учетные данные пользователя), где в качестве события можно хранить его изолированным.

Вы также можете отменить регистрацию в самом обработчике, если это было одноразовымсобытие, о котором вы заботились.Это действительно сводится к вашей конкретной потребности и экземпляру, слабый шаблон событий - это шаблон для работы с этим широким приложением, но это не значит, что вы должны использовать этот шаблон в каждом отдельном случае, когда возникает эта проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...