2011-10-18 5 views
6

El reference page para Application.ThreadException diceApplication.ThreadException: ¿pérdida de memoria si no está separada?

Debido a que este es un evento estático, debe separar sus controladores de eventos cuando se dispone su aplicación, o pérdidas de memoria resultará.

A pesar de que el código de muestra en esa misma página no separa el controlador de eventos, ¿realmente se produce una fuga si el controlador de eventos no está separado?

Parece que el único momento en que se debe desconectar el controlador es si la aplicación se apaga. En ese caso, independientemente de si el controlador está desconectado, toda la memoria utilizada por la aplicación se liberará de todos modos.

+3

Sí, no anular el registro de su controlador de eventos un milisegundo antes de que la aplicación finalice no es una pérdida. –

Respuesta

4

Probablemente es muy raro, pero el método de una aplicación Windows Forms Main() podría, por alguna razón, el siguiente aspecto:

static bool AbortStartup { get; set; } 

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

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

Cuando se cierra la pantalla de inicio, aparecerá la ventana principal, a menos que la pantalla de bienvenida establecer la propiedad AbortStatup en true. Si agregó un controlador de eventos al Application.ThreadException desde la pantalla de bienvenida, la instancia de CancelableSplashScreen no se recolectará hasta que la aplicación finalice, lo que puede demorar un tiempo considerable.

1

Si deja ir la referencia al objeto (suponiendo que es un método de instancia que es el controlador de eventos), entonces sí, habrá una fuga; no podrá darse de baja del evento (ya que ya no tiene la instancia) y el objeto existirá hasta que termine el dominio de la aplicación (ya que ese es el tiempo de vida de las variables estáticas).

Cuestiones relacionadas