События и утечки памяти в .NET - PullRequest
4 голосов
/ 04 декабря 2009

Я использую C # .NET 3.5 ... и я работаю, чтобы отделить объект BLL, перемещая действия, связанные с базой данных, в отдельный рабочий объект. Рабочий объект добавляет объекты в базу данных и отправляет сообщение об успехе или ошибке обратно объекту BLL.

Когда я копирую рабочий объект в BLL, я связываю события рабочего и устанавливаю обработчик событий BLL, используя синтаксис события + = делегат (обработчик события).

Я слышал, что если я не соединю слушателей явным образом с синтаксисом - =, когда рабочий избавлен, существует вероятность утечек памяти.

Вся эта обработка происходит в службе Windows, которая выбирает сообщения из очереди и вызывает соответствующий объект BLL ... Я боюсь, что в этом процессе может возникнуть утечка памяти.

Ответы [ 4 ]

6 голосов
/ 04 декабря 2009

Подписка на событие добавляет ссылку от подписчика на провайдера.

x.Event + = y.handler означает, что x теперь содержит ссылку на y

Если x имеет более длительный срок службы, чем y, то y не сможет собирать мусор, пока не исчезнут все ссылки на x.

В вашем случае вы слушаете события от работников BLL (если я вас правильно понимаю), тогда у вас есть ссылки на работников, остающихся в BLL, если вы не отказались от подписки.

Однако, если вы заканчиваете с работником одновременно с BLL, это на самом деле не имеет значения.

3 голосов
/ 04 декабря 2009

То, что вы слышали, правда. Пока ваш объект подписан на событие от другого достижимого объекта, среда выполнения не будет освобождать объект подписчика. Если ваше приложение создает один или небольшой набор рабочих объектов в начале своей жизни, то все будет в порядке. Если приложение создает рабочий объект для каждого объекта BLL, но ссылка на экземпляр BLL освобождается, вы тоже должны быть в порядке.

Опасность состоит в том, чтобы вслепую подписать метод экземпляра на событие static или событие экземпляра объекта с большим временем жизни.

1 голос
/ 04 декабря 2009

Если вы когда-либо подписываетесь на событие только один раз в вашем сервисе, у вас все будет в порядке.

0 голосов
/ 04 декабря 2009

Узнайте, как использовать фоновый рабочий .NET или пул потоков, и механизмы синхронизации, доступные в этих решениях.

...