Application.ThreadException: утечка памяти, если не отсоединена? - PullRequest
7 голосов
/ 18 октября 2011

Справочная страница для Application.ThreadException говорит:

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

Несмотря на тот факт, что пример кода на той же странице не отсоединяет обработчик события, действительно ли происходит утечка, если обработчик события не отсоединен?

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

Ответы [ 2 ]

5 голосов
/ 19 октября 2011

Это, вероятно, очень необычно, но метод Main() приложения WinForms может, по какой-то причине, выглядеть так:

static bool AbortStartup { get; set; }

[STAThread]
public static void Main()
{
    Application.Run(new CancelableSplashScreen());

    if (!AbortStartup)
        Application.Run(new MainWindow());
}

Когда закрывается заставка, появляется главное окно, если на заставке не установлено свойство AbortStatup равное true. Если вы добавили обработчик событий в Application.ThreadException из заставки, экземпляр CancelableSplashScreen не будет собирать мусор до тех пор, пока приложение не завершится, что может быть значительно позже.

1 голос
/ 18 октября 2011

Если вы отпустите ссылку на объект (при условии, что это метод экземпляра, который является обработчиком событий), тогда да, будет утечка;вы не сможете отписаться от события (так как у вас больше нет экземпляра), и объект будет существовать до конца домена приложения (так как это время жизни статических переменных).

...