none
ApplicationExit no funciona o algo hago mal, seguro RRS feed

  • Pregunta

  • Buenas.


    Veo que program.cs lanza Application.Run(new MainForm()); y en MainForm hago unas comprobaciones de archivos y carpetas. Hay una comprobación concreta que si no encuentra un archivo muestra un openfiledialog, y si el usuario cancela, pongo Aplication.Exit() y funciona bien, la aplicación termina, pero en el resto de comprobaciones uso un Boolean, y si al final de las comprobaciones el Boolean es true, lanzo un form para que el usuario ponga la contraseña, pero si es false pongo el Application.Exit() y este es el que no funciona.

    ¿Alguna idea????

    martes, 19 de julio de 2016 3:03

Todas las respuestas

  • Usa el debugger y sigue la ejecución del programa, a ver si efectivamente llega hasta el Application.Exit, no vaya a ser que la ejecución siga otro camino y no llegue a ejecutarse la instrucción. Si efectivamente llegas hasta el Exit, debería funcionar y salir de la aplicación incluso aunque estés en otro Form distinto.
    martes, 19 de julio de 2016 5:46
  • Hola.

    Lo he hecho, el hilo llega a Apllication.Exit();, vuelve a Program.cs y a la línea Application.Run(new MainForm()); y ahí se queda. Y eso es lo que pasa, no se cierra la aplicación.

    martes, 19 de julio de 2016 14:09
  • hola

    de casualidad estas lanzando algun thread ? porque es raro que el Applicatio.Exit() no cierra todo lo que tengas abierto

    puede que si quede algun hilo en ejecucion no termine el proceso hasta que concluya

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 19 de julio de 2016 14:12
  • Hola,

    Puedes publicar un poco mas de código para entenderlo mejor.

    martes, 19 de julio de 2016 14:12
  • Pues en principio que yo sepa no. Voy a publicar más código.
    martes, 19 de julio de 2016 15:02
  • Claro, ahí va:

    En program.cs veo esto:

     [STAThread]
    private static void Main(string[] args)
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm());
    }

    En MainForm.cs

    public MainForm()
    {
    DialogResult respuesta = DialogResult.No;
    Boolean correcto = true;

    InitializeComponent();

    Primer bloque de comprobación de archivo

    Si algo no está bien, correcto = false;

    Si correcto == true, segundo bloque de comprobación de carpetas

    Si algo no está bien, correcto = false;

    Si correcto == true, tercer bloque de comprobación de archivo

    Si no se encuentra un archivo concreto, lanzo un OpenFileDialog, si el archivo está mal o se cancela la         operación correcto = false;

    if(correcto == true)
    {
    Acceso FormAcceso = new Acceso();
    respuesta = FormAcceso.ShowDialog(); 
                    
    if(respuesta == DialogResult.OK)
    {
    FormAcceso.Close();
    Application.Run(new Aplicacion());
    }
    }
     else
                    Application.Exit();

    }

    En el tercer bloque, donde si no se encuentra un archivo se ejecuta un OpenFileDialog para buscarlo, si el usuario cancela, todo va bien y la aplicación termina correctamente.

    Pero si por ejemplo en el segundo bloque que se comprueban unas carpetas, si alguna no se encuentra la aplicación muestra un Messagebox.Show con el error, y al pulsar Aceptar la aplicación debe terminar y no termina, y la ventana MainForm se queda en pantalla.

    martes, 19 de julio de 2016 15:20
  • Veo una cosa en tu fragmento de código que tiene un aspecto horrible: Has metido una llamada a Application.Run dentro de MainForm, Esto puede tener toda clase de consecuencias imprevisibles. Se supone que Application.Run se debería usar exclusivamente una única vez en el Program.cs.

    martes, 19 de julio de 2016 19:42
  • Hola.

    Bueno, puede parecer horrible, pero como valido una contraseña es la mejor forma que he encontrado para hacerlo. No te pido sugerencia porque se como hacerlo de otra forma.

    Pero al margen, ese bloque de código no se ejecuta si hay previamente un error, ¿se te ocurre que puede ocurrir?

    Saludos.

    P.D.: Fijo que hay cosas muy mal hechas, en realidad no llevo mucho tiempo programando en C#

    miércoles, 20 de julio de 2016 14:08
  • Perdón si ha parecido un poco fuerte lo de llamarlo "horrible". Me refería a que es algo que supuestamente no se debería hacer nunca. En teoría solo debería existir un Application.Run que es le que inicializa la aplicación de ventanas desde el Main que es el punto de entada. Si ejecutas otro Application.Run pueden ocurrir cosas rarísimas, como por ejemplo que se inicie una segunda copia de la aplicación y por eso no funcione el Application.Exit, que probablemente intentará salir de la copia principal, que él debe presumir que es la única.

    No comprendo por qué dices que validas la contraseña, cosa que no tiene absolutamente nada que ver con el Application.Run, que sirve para iniciar la aplicación, pero si estás validando una contraseña significa que la aplicación ya está en marcha, y en consecuencia no tiene sentido ejecutar Application.Run.

    miércoles, 20 de julio de 2016 19:15
  • No hay problema, toda crítica es buena.

    Tienes razón, y he cambiado el código, ocultando MainForm y abriendo un formulario para lanzar la aplicación, y nada, ocurre lo mismo. De hecho he probado a eliminar MainForm, he creado un nuevo formulario llamado Comprobacion, lo he sustituido por MainForm en Program.cs en el Application.Run y ocurre exactamente lo mismo.

    Lo de la validación de la contraseña lo he comentado porque desde MainForm abro un nuevo formulario de comprobación de contraseña, que devuelve un DialogResult, sólo por eso, porque hay algo en medio.

    Voy a investigar más, y a tocar el código que hay entre medias de MainForm. Con C# me ha ocurrido lo que me ocurría hace años programado en C bajo AIX, escribes código, está bien, es correcto, pero no funciona, lo eliminas del todo, vuelves a empezar, escribes exactamente lo mismo y funciona, y yo no soy de los que parchea y si suena la flauta estupendo, a mi gusta saber por qué las cosas no funcionan.

    Saludos.

    jueves, 21 de julio de 2016 14:19