2010-08-27 30 views
13

Básicamente Tengo una forma principal, que durante la carga, se abre un formulario secundario para iniciar la sesión en el usuario. Cuando cancelan o cierran este formulario de inicio de sesión, necesito cerrar toda la aplicación.¿Cuál es la diferencia entre estos métodos para cerrar mi aplicación?

Pero parece que hay algunas maneras diferentes para cerrar un programa en C#:

  1. Application.Exit();

  2. Application.ExitThread();

  3. Environment.Exit(1);

  4. Process.GetCurrentProcess().Kill();

  5. SFTPClient.LDAPLoggedIn = false; Close();

EDIT: Lo siento si éste no está claro: Se establece una propiedad en un objeto controlador para indicar que el inicio de sesión falló. Después de abrir el formulario secundario, verificaría esta propiedad en el formulario principal para ver si el programa debería continuar o no. Básicamente cambia la responsabilidad de salir del programa a los padres sin una excepción.

6: throw new Exception("User closed the form");

puedo ver que hay dos maneras de manejar que:

  • informando a los padres de que algo salió mal (como en 5 y 6.)
  • Cierre de la programa desde el formulario hijo.

Es cualquiera de estos dos considerados mejores prácticas?

Cada enfoque parece tener el mismo efecto en mi programa, pero ¿cómo es lo que realmente comparar?

ACTUALIZACIÓN: Gracias por las respuestas. Para los que buscan esta pregunta en el futuro la gente y curiosos, este fue mi solución en el final:

private void FormMain_Load(object sender, EventArgs e) 
{ 
    if (new FormLogin().ShowDialog(this) == DialogResult.Cancel) Close(); 
} 

y:

private void buttonCancel_Click(object sender, EventArgs e) 
{ 
    Close(); 
} 

he descubierto que cuando una forma se cierra mediante clic en el 'X' , DialogResult está configurado para Cancelar automáticamente, así que todo lo que tengo que hacer es Close()

Respuesta

12

Si quiere manejar con gracia la excepción en el último caso, eso es ok (aunque no es genial), siempre y cuando se trate de una situación excepcional para su aplicación. De lo contrario, crearía un nuevo método que muestre el formulario como un diálogo con un booleano.Si el booleano devuelve falso (es decir, el usuario cerró el formulario), entonces manejaría la aplicación cerrada desde allí (usando Application.Exit()).

Es, en mi humilde opinión, una muy mala práctica cerrar la aplicación de un niño en lugar de decirle al padre. La única vez que estoy de acuerdo con esto es en una situación FailFast, que es muy rara.


Este método se detiene bucles de todos los mensajes que se ejecuta en todas las discusiones y cierra todas las ventanas de la aplicación. Este método no obliga a la aplicación a salir. El método Exit generalmente se llama desde un bucle de mensaje y fuerza a Run a regresar. Para salir de un bucle de mensaje solo para el hilo actual, llame a ExitThread.

Ver más arriba.


termina este proceso y le da al sistema operativo subyacente el código de salida especificado.


Kill obliga a una terminación del proceso, mientras que CloseMainWindow solamente solicita una terminación. Cuando se está ejecutando un proceso con una interfaz gráfica, su ciclo de mensajes está en estado de espera. El ciclo de mensajes se ejecuta cada vez que el sistema operativo envía un mensaje de Windows al proceso.


  • SFTPClient.LDAPLoggedIn = false; Close();

Después de la aclaración en el comentario (pasa a fluir de nuevo a los padres y se encarga de allí), esto es, con mucho, la mejor manera de hacer esto.


  • throw new Exception("User closed the form");

se emite una excepción al proceso que llama. Si este es el hilo principal, arrojará la excepción de una manera muy fea.

+1

Lo sentimos, para aclarar # 5. Establece una propiedad en un objeto controlador para indicar que el inicio de sesión falló. Después de abrir el formulario secundario, verificaría esta propiedad en el formulario principal para ver si el programa debería continuar o no. Básicamente cambia la responsabilidad de salir del programa a los padres sin una excepción. – Nobody

+0

@rmx - DEFINITIVAMENTE # 5 entonces, sin lugar a dudas. –

2

Debe usar Form.Close() en lugar de Application.Exit. Como se señala en la documentación de MSDN, eventos como Form.Close y Form.Closing no se activan cuando se utiliza Application.Exit.

+0

bien, puedo ver la ventaja de eso. Entonces debe llamarse 'Application.Exit' desde Program.cs después de que cada formulario haya sido' Close' d? – Nobody

+0

No hay razón para hacerlo. Su proceso finalizará si ha salido de hilos hijo y su función principal regresa (terminando el hilo principal). Si desea proporcionar un código de retorno que pueda ser de interés para el proceso que inició el suyo, use 'Environment.Exit (retcode)' al final de su función principal. –

4

Todas estas formas de terminar la aplicación son demasiado complejas y útiles en diferentes escenarios, pero no en el tuyo.

Puede rediseñar ligeramente su aplicación para resolver su problema de una manera más elegante. En el método principal puede mostrar el formulario de inicio de sesión y si los usuarios hacen clic en el botón "cancelar", entonces simplemente salga de su método principal.De lo contrario, le mostrará la forma principal:

class Program { 
    static void Main(String[] args) { 
    if (Login.Show()) { 
     //Show main form for your application 
    } 
    //otherwise you simply return from Main method 
    } 
} 

Este comportamiento más claro y simple. Y en la mayoría de los casos, la forma principal es demasiado pesada, por lo que su usuario debería esperar más tiempo para ver la primera ventana desde su aplicación.

+0

+1 Casi exactamente lo que digo, con código. –

1

Gracias a OP por su solución, solo quería agregarle.

Para cerrar el formulario secundario y un resultado distinto Cancelar para los padres:

this.DialogResult = DialogResult.OK; 
this.Close(); 
Cuestiones relacionadas