none
Aparte de End ¿Qué otra opción existe para terminar la ejecución del programa desde un módulo?

    Pregunta

  • Creo que la pregunta lo abarca todo pero es neceesario poner algo aquí, así que repito, qué otra alternativa aparte de End existe para salir del programa desde un módulo?
    martes, 1 de noviembre de 2016 23:29

Respuestas

  • Hola James-2016,

    También podrías usar :

    Application.Exit()

    'O también Environment.Exit(0)


    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 miércoles, 2 de noviembre de 2016 20:37
    miércoles, 2 de noviembre de 2016 0:13
  • "James-2016" preguntó:

    > qué diferencia existe entre las tres?

    Más que "entre las TRES" digamos "entre las DOS" las diferencias que existen entre los métodos Application.Exit y Environment.Exit, porque la instrucción End del propio lenguaje Visual Basic llama al método Environment.Exit.

    Para no repetir aquí lo que dice la ayuda de MSDN sobre cada método, solamente te diré que es más conveniente utilizar Application.Exit que End o Environment.Exit, ya que Application.Exit detiene todos los bucles de mensajes en ejecución de todos los subprocesos y posteriormente cierra todos los formularios abiertos de la aplicación, lo que hará que se desencadene los eventos relacionados con el cierre del formulario, teniendo la posibilidad el usuario de cancelar el cierre de la aplicación si en el evento FormClosing de cualquier formulario actualmente abierto se establece el valor True a la propiedad Cancel del parámetro FormClosingEventArgs.

    Por ejemplo, si ejecutas el método Application.Exit y en algún formulario abierto tienes implementado su evento FormClosing como indico a continuación:

        Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    
            e.Cancel = True
    
        End Sub

    la aplicación no se cerrará, cosa que sí se hará si ejecutas la instrucción End, o lo que es lo mismo, el método Environment.Exit, ya que estos últimos "pasan olímpicamente" de invocar a los eventos FormClosing y FormClosed.

    Y otra diferencia que entiendo puede ser muy importante. Si llamas a End o Environment.Exit desde un bloque Try que tenga implementado su correspondiente bloque Catch y opcionalmente un bloque Finally, el código que exista en ambos bloques no se ejecutará, cosa que sí se hará si llamas a Application.Exit, lo que puede dar lugar a que no se liberen correctamente ciertos recursos que puedas estar utilizando, como algún archivo que tengas actualmente abierto:

     
           Try
                ' Cerramos la aplicación
                Application.Exit()
                
                ' Generamos una excepción
                Throw New ArgumentException()
    
            Catch ex As Exception
                Console.WriteLine(ex.Message)
    
            Finally
                Console.WriteLine("Se ha ejecutado el bloque Finally.")
    
            End Try

    Observarás que se ejecutan el código existente en los bloques Catch y Finally. Ahora cambia Application.Exit por End o Environment.Exit y verás que no se ejecutan los bloques Catch y Finally.

    Si puedes, utiliza el método Application.Exit(), y para más información al respecto te remito a la ayuda de MSDN que aparecen en los enlaces indicados arriba.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 2 de noviembre de 2016 17:58
    Moderador

Todas las respuestas

  • Hola James-2016,

    También podrías usar :

    Application.Exit()

    'O también Environment.Exit(0)


    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 miércoles, 2 de noviembre de 2016 20:37
    miércoles, 2 de noviembre de 2016 0:13
  • Gracias y qué diferencia existe entre las tres?
    miércoles, 2 de noviembre de 2016 0:45
  • "James-2016" preguntó:

    > qué diferencia existe entre las tres?

    Más que "entre las TRES" digamos "entre las DOS" las diferencias que existen entre los métodos Application.Exit y Environment.Exit, porque la instrucción End del propio lenguaje Visual Basic llama al método Environment.Exit.

    Para no repetir aquí lo que dice la ayuda de MSDN sobre cada método, solamente te diré que es más conveniente utilizar Application.Exit que End o Environment.Exit, ya que Application.Exit detiene todos los bucles de mensajes en ejecución de todos los subprocesos y posteriormente cierra todos los formularios abiertos de la aplicación, lo que hará que se desencadene los eventos relacionados con el cierre del formulario, teniendo la posibilidad el usuario de cancelar el cierre de la aplicación si en el evento FormClosing de cualquier formulario actualmente abierto se establece el valor True a la propiedad Cancel del parámetro FormClosingEventArgs.

    Por ejemplo, si ejecutas el método Application.Exit y en algún formulario abierto tienes implementado su evento FormClosing como indico a continuación:

        Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    
            e.Cancel = True
    
        End Sub

    la aplicación no se cerrará, cosa que sí se hará si ejecutas la instrucción End, o lo que es lo mismo, el método Environment.Exit, ya que estos últimos "pasan olímpicamente" de invocar a los eventos FormClosing y FormClosed.

    Y otra diferencia que entiendo puede ser muy importante. Si llamas a End o Environment.Exit desde un bloque Try que tenga implementado su correspondiente bloque Catch y opcionalmente un bloque Finally, el código que exista en ambos bloques no se ejecutará, cosa que sí se hará si llamas a Application.Exit, lo que puede dar lugar a que no se liberen correctamente ciertos recursos que puedas estar utilizando, como algún archivo que tengas actualmente abierto:

     
           Try
                ' Cerramos la aplicación
                Application.Exit()
                
                ' Generamos una excepción
                Throw New ArgumentException()
    
            Catch ex As Exception
                Console.WriteLine(ex.Message)
    
            Finally
                Console.WriteLine("Se ha ejecutado el bloque Finally.")
    
            End Try

    Observarás que se ejecutan el código existente en los bloques Catch y Finally. Ahora cambia Application.Exit por End o Environment.Exit y verás que no se ejecutan los bloques Catch y Finally.

    Si puedes, utiliza el método Application.Exit(), y para más información al respecto te remito a la ayuda de MSDN que aparecen en los enlaces indicados arriba.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 2 de noviembre de 2016 17:58
    Moderador
  • ah, ok, entonces End ejecuta a Enviroment.exit por lo que son básicamente lo mismo y cierran el programa digamos de una manera intempestiva. Application.exit por el contrario notifica primero a todos los "surtidores de mensajes" como dice la documentación de los enlaces.

    Muchas gracias, clarísima la explicación.

    miércoles, 2 de noviembre de 2016 20:37