В следующей программе ...Вывоз мусора из неиспользуемых объектов с обработчиком событий живого
using System;
class Program
{
static Parent parent;
static void Main(string[] args)
{
parent = new Parent();
// The program hereafter runs for a long time and occasionally
// causes parent.SomeEvent to be raised.
}
}
class Parent
{
public event EventHandler SomeEvent;
public Parent()
{
new Handler(this);
}
}
class Handler
{
public Handler(Parent parent)
{
parent.SomeEvent += parent_SomeEvent;
}
void parent_SomeEvent(object sender, EventArgs e)
{
// Does something important here.
}
}
Обратите внимание, что экземпляр Handler
объект не ссылается, хотя он подписался SomeEvent
. Возможно ли, что после того, как программа будет работать некоторое время, сборщик мусора может решить исключить экземпляр Handler
, и его обработчик parent_SomeEvent
, следовательно, больше не будет вызываться всякий раз, когда поднимается parent.SomeEvent
?
Мне нужно это пояснение для приложения, которое я пишу. Есть много Handler
-подобных объектов, которые создаются, как показано выше, без ссылки. Основной целью Handler
является подписка на SomeEvent
. Нет никаких полезных методов для вызова ссылки на экземпляр Handler
, поэтому я был бы в порядке, не ссылаясь на него иначе. Во время отладки я не сталкивался с какими-либо проблемами. Но теперь я обеспокоен тем, что проблемы могут возникнуть после развертывания, когда приложение работает в течение длительного времени, а сборщик мусора более активен.
Отметьте это сообщение http://stackoverflow.com/questions/4526829/why-and-how-to-avoid-event-handler-memory-leaks для углубленного объяснения – Osiris