Подтвердить что ты не робот

Подписывается ли подписка на событие лямбда на утечку памяти?

Создает ли этот код утечку памяти?

WebClient client = new WebClient();

client.DownloadDataCompleted += (sen, args) => {

};
client.DownloadData("http://foo.bar");

Как нет возможности фактически отказаться от подписки на событие. Могу ли я сказать, что мы никогда не должны использовать lambda для подписки на события?

4b9b3361

Ответ 1

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

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

Ответ 2

Если вам нужно отказаться от подписки на мероприятие, вам нужна ссылка. К сожалению, это означает, что вы не можете использовать этот конкретный синтаксис.

Вам нужно будет запомнить экземпляр делегата, который вы использовали, например:

var handler = (s, e) => {};

client.DownloadDataCompleted += handler;
...
client.DownloadDataCompleted -= handler;