2011-10-18 10 views
6

Il reference page per Application.ThreadException diceApplication.ThreadException: perdita di memoria se non è stato rimosso?

Poiché si tratta di un evento statico, è necessario staccare i vostri gestori di eventi quando l'applicazione è disposto, o perdite di memoria si tradurrà.

Nonostante il codice di esempio su quella stessa pagina non stacchi il gestore di eventi, si perde davvero se il gestore di eventi non viene rimosso?

Sembra che l'unica volta che il gestore deve essere rimosso è se l'applicazione si arresta. In tal caso, indipendentemente dal fatto che il gestore sia staccato o meno, tutta la memoria utilizzata dall'applicazione verrà comunque liberata?

+3

Sì, non annullare la registrazione del gestore eventi un millisecondo prima che l'app termini non è una perdita. –

risposta

4

Probabilmente è molto raro, ma il metodo di un'applicazione WinForms Main() potrebbe, per qualche motivo, simile a questa:

static bool AbortStartup { get; set; } 

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

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

Quando la schermata di avvio si chiude, viene visualizzata la finestra principale, a meno che la schermata iniziale imposta la proprietà AbortStatup a true. Se hai aggiunto un gestore di eventi a Application.ThreadException dalla schermata iniziale, l'istanza di CancelableSplashScreen non verrà raccolta automaticamente finché l'applicazione non termina, il che potrebbe essere un considerevole momento successivo.

1

Se si lascia andare il riferimento all'oggetto (supponendo che sia un metodo di istanza che è il gestore di eventi) allora sì, ci sarà una perdita; non sarai in grado di annullare l'iscrizione all'evento (dal momento che non hai più l'istanza) e l'oggetto esisterà fino a quando non termina il dominio dell'app (poiché questa è la durata delle variabili statiche).