.net - net - ¿Por qué no debería usar Process.GetCurrentProcess(). Kill() para salir de mi aplicación WinForm?
return asp net (7)
En este momento, cuando el usuario desea salir de mi aplicación, hago las pocas cosas que debo (es decir, desconectarme del servidor, guardar los datos del usuario ...) y luego hago lo siguiente:
- Salir de todos mis mainloops usando booleanos
- abortar los subprocesos que todavía se están ejecutando (normalmente, mi subproceso de sondeo del servidor)
- amablemente llame a Application.Exit ();
Esto toma unos segundos para salir y no tiene un propósito real (todo ya está guardado en el servidor, por lo que realmente no me importa lo que suceda allí)
Si utilizo esto en su lugar, obtuve una terminación instantánea sin inconvenientes que puedo pensar:
System.Diagnostics.Process.GetCurrentProcess().Kill();
¿Por qué no podría terminar mi proceso y dejar que CLR elimine el dominio de aplicación?
Sé que es importante disponer de sus recursos compartidos con cuidado (manejadores de archivos IO, etc.) (así que no responda :)), pero una vez hecho, ¿hay alguna razón real para salir de mi aplicación de forma limpia?
¡Esa es una buena pregunta!
Una vez (hace más de diez años) escribí una aplicación VB6 que se colgó en la terminación debido a un error confirmado en el WinINet OCX (o como se llamara) debido al certificado particular utilizado en el servidor web con el que estaba hablando.
Sin ninguna forma de solucionar este error, utilicé TerminateProcess y, por lo que sé, esta aplicación se usó en varios miles de máquinas durante varios años y ¡nunca me enteré de ningún problema relacionado con este hack!
¿Por qué no usar System.Environment.Exit(int) ? Parece que quieres hacer esto solo para guardar el código. Para mí es mucho más claro ver que el llamado a Exit hace y su cierre será más controlado, se ejecutarán los Finalizadores y los Finalizadores Críticos.
Cabe señalar que los finalizadores en realidad nunca se ejecutan , por lo que matar el proceso no es muy diferente de cualquier otra razón para omitir el código de finalización, como los finalizadores lentos o un finalizador que lanza una excepción.
Con todo, no me preocuparía mucho el hecho de cerrar la aplicación en unos pocos segundos, especialmente si oculta inmediatamente todas las ventanas y "desaparece" para el usuario. Sin embargo, si el cierre toma docenas de segundos y / o es probable que el usuario ejecute la aplicación nuevamente y no sea compatible con varias instancias, llamar a Process.Kill
puede ser una buena idea.
Conozco algunas aplicaciones que tardan años en terminarse, y espero verlas algún día simplemente matándose brutalmente en lugar de hacerme a mí, el usuario, hacerlo (es especialmente molesto en el reinicio del sistema operativo).
En primer lugar, creo que te refieres a Process.Kill()
, no a Process.TerminateProcess()
. En segundo lugar, matar el proceso simplemente lo arrancará. No se ejecutará ningún código de limpieza y su aplicación no tendrá la oportunidad de cancelar la eliminación (por ejemplo, si el usuario tiene datos no guardados). Si estás contento con eso, hazlo.
Matar el proceso significaría que, finalmente, los bloques no se ejecutarán y, probablemente, ni siquiera los objetos finalizadores críticos , que en realidad pueden ser críticos y causar una fuga de recursos a nivel del sistema. También puede causar errores inesperados en el futuro cuando alguien más mantiene el código, ya que ellos (o usted) tendrán que torcer sus cabezas, y tendrán que pensar cada vez que escriban un bloque final si se ejecutará.
Tenga en cuenta que si está escribiendo en una secuencia de archivo / red, es posible que su escritura sea incompleta.
Si su aplicación está lista para lidiar con datos corruptos de esa manera, entonces no hay razón para no hacerlo. Sin embargo, si puedes salir por otros medios, te lo recomendaría.
Usando bibliotecas de terceros sin ninguna forma de detectar sus errores o fugas, a veces la única manera de finalizarlo sin lanzar un MessageBox fallido, es matar el proceso.