2011-10-18 11 views
6

reference page dla Application.ThreadException mówiApplication.ThreadException: wyciek pamięci, jeśli nie jest odłączony?

Ponieważ jest to statyczna zdarzeń, należy odłączyć swoje obsługi zdarzeń gdy aplikacja jest umieszczona lub wycieki pamięci spowoduje.

Niezależnie od tego, że kod przykładowy na tej samej stronie nie odłącza procedury obsługi zdarzeń, czy rzeczywiście wycieknie, jeśli procedura obsługi zdarzeń nie zostanie odłączona?

Wydaje się, że jedynym sposobem odłączenia programu obsługi jest zamknięcie aplikacji. W takim przypadku, czy moduł obsługi zostanie odłączony, cała pamięć używana przez aplikację zostanie zwolniona?

+3

Tak, nie wyrejestrowywanie programu obsługi zdarzeń przez milisekundę przed zakończeniem aplikacji nie jest przeciekiem. –

Odpowiedz

4

Prawdopodobnie jest to bardzo rzadkie, ale Main() metoda aplikacji WinForms mogłaby ewentualnie, z jakiegoś powodu, wyglądać następująco:

static bool AbortStartup { get; set; } 

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

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

Kiedy zamyka się ekran powitalny, pojawi się okno główne, chyba że ekran powitalny ustaw właściwość AbortStatup na true. Jeśli dodałeś program obsługi zdarzeń do Application.ThreadException z poziomu ekranu powitalnego, instancja CancelableSplashScreen nie zostanie usunięta ze śmiecia, dopóki aplikacja nie zakończy działania, co może zająć dużo czasu później.

1

Po zezwoleniu na odwołanie do obiektu (przy założeniu, że jest to metoda instancji, która obsługuje zdarzenie), tak, nastąpi przeciek; nie będzie można anulować subskrypcji ze zdarzenia (ponieważ nie masz już instancji) i obiekt będzie istniał do czasu zakończenia domeny aplikacji (ponieważ jest to czas życia zmiennych statycznych).