none
Problemas con Thread.Sleep(3000) RRS feed

  • Pregunta

  • Tengo 2 métodos, 

    primero: realizo una consulta en SQL, lleno un datagridview y valido que el datagridview traiga datos, en caso de que no traiga datos envía un correo dando aviso.

    segundo: si trae datos lo que hago es cerrar ese form

    ahora, el problema radica es que cuando valida que trae datos cierra inmediatamente el form sin haber llenado el datagridview entonces me muestra un error, ya que sin cargar el datagriedview se esta cerrando.

    espero ser mas claro, al pinchar el botón que realiza esto

      private void aRSToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Form Formulario = new frmARS();
                Formulario.Show();
            }

    cuando abre el formulario ejecuta ambos métodos (el segundo luego de validar tiene un close();)

    entonces pensé solucionarlo con un Thread.Sleep(3000)  para que en esos 3 segundos llenara el datagriedview, pero no trabaja como quiero que lo haga, al final pincho el botón y termina retrasando toda la ejecución 3 segundos(no el segundo metodo que es como lo necesito).

    espero haber sido claro, igual quedo atento.

    saludos.

    jueves, 19 de abril de 2018 14:18

Respuestas

Todas las respuestas

  • Creo que sí ha sido claro.  Lo que no comprendo es por qué tiene necesidad de usar un DGV, que es un control específicamente diseñado para interacción con un usuario de una forma que no es para lo que se diseñó.  Si no hay datos, envía un correo-e; si los hay, el usuario no tiene permitido verlos o modificarlos.  Entonces ¿cuál es la necesidad de tener un DGV en primer lugar?

    Pienso que si eliminamos el DGV sus problemas se simplificarán.  Explique su necesidad actual de tener un DGV y el objetivo final que desea conseguir.


    Jose R. MCP
    Code Samples

    jueves, 19 de abril de 2018 14:23
    Moderador
  • hola

    >>cuando abre el formulario ejecuta ambos métodos (el segundo luego de validar tiene un close();)

    no entiendo, porque cierras el form cuando cargas el grid, eso no tiene sentido

    se supone que si abres un form que carga un grid es para visualizar la lista

    >>entonces pensé solucionarlo con un Thread.Sleep(3000)  para que en esos 3 segundos llenara el datagriedview,

    no pensaste usar un Timer ? entonces lanzas la consulta y con un timer en el evento Tick realizas la operacion despues del tiempo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 19 de abril de 2018 14:37
  • Hola Jose, resulta que esto será una herramienta de diagnostico que se debe gestionar automáticamente, pero en caso de que envié el correo porque no encuentra datos, debo entrar a gestionar la herramienta manualmente.

    InitializeComponent();
                ARS(dataGridView1);
                validar();

    el error aparece es cuando invoco el formulario, porque es como si  le digo que muestre el formulario, pero lo primero que inicializa el formulario es un close();

    public void validar()
            {
                
                try
                {

                    if (dataGridView1.Rows.Count > 1)
                    {
                        Thread.Sleep(3000);
                        Close();
                       /* MessageBox.Show("Se cerrara esta maricada");
                         /*Close();*/
                    }
                }
                catch (Exception ex)
                {

                    MessageBox.Show(""+ex);
                }
                
            }

    intente adjuntar unos pantallazos pero no fue posible, espero que con el código sea un poco mas claro

    saludos por la pronta respuesta

    jueves, 19 de abril de 2018 14:50
  • >>no entiendo, porque cierras el form cuando cargas el grid, eso no tiene sentido

    >>se supone que si abres un form que carga un grid es para visualizar la lista

    Hola Leandro, resulta que esto será una herramienta de diagnostico que se debe gestionar automáticamente, pero en caso de que envié el correo porque no encuentra datos, debo entrar a gestionar la herramienta manualmente.

    entonces cuando este trabajando automáticamente claramente es un desperdicio llenar un datagriedview, pero en el momento de un fallo sera de utilidad saludos.

    jueves, 19 de abril de 2018 14:53
  • Ok, pero viera que no responde mi pregunta.  ¿Por qué necesita un DGV?  ¿No puede acaso validar los datos en una colección de clases o un DataTable (que no me gustan, pero bueno, sería mejor que un DGV)?

    Jose R. MCP
    Code Samples

    jueves, 19 de abril de 2018 14:53
    Moderador
  • la verdad las realizo desde el DGV porque me parece la forma mas fácil de validar ya que reviso 

    el datagridview.Rows.Count==1 (con esto se que solo trajo los encabezados) y envio el mail,

    desconozco la formas que me planteas. 

    jueves, 19 de abril de 2018 14:59
  • Ok.  ¿Cómo llena usted el DGV?  Porque si es para acceder a la cuenta de registros, el DGV tiene que eliminarse sí o sí.  Le puedo enseñar cómo, pero necesito saber cómo obtiene usted los datos.

    Jose R. MCP
    Code Samples

    jueves, 19 de abril de 2018 15:01
    Moderador
  • te adjunto el código del llenado

    public void ARS(DataGridView dataGridView1)
            {
                DateTime Ahora = DateTime.Now;
                string AhoraString = Ahora.ToString("yyyy-MM-dd HH:mm:ss.FFF");
                DateTime Ahora1 = Ahora.AddMinutes(-30);
                string Ahora1String = Ahora1.ToString("yyyy-MM-dd HH:mm:ss.FFF");

                try
                {

                    da = new SqlDataAdapter("select top 10 Logic_code,Fecha,Intensidad,VehiculoLongitud1,VehiculoLongitud2,VehiculoLongitud3,Ocupacion,Velocidad from xxxx..xxx where Logic_code in (select ELEM_GEN_COD_LOG " +
              "from zzzz..zzzzz where TIP_EQUIP_CODIGO = 3 and ELE_TIP_EQUIP_CODIGO is null) and fecha between '" + Ahora1String + "' and '" + AhoraString + "' order by fecha desc ", cn);
                    dt = new DataTable();
                   da.Fill(dt);
                    dataGridView1.DataSource = dt;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("no se pudo llenar el datagridview" + ex.ToString());
                }

    jueves, 19 de abril de 2018 15:05
  • hola

    >>entonces cuando este trabajando automáticamente claramente es un desperdicio llenar un datagriedview, pero en el momento de un fallo sera de utilidad

    sigo si entender porque cierras el form, si tienes algo automatico que no requiere interaccion porque abres un form desde un menu? eso no tiene sentido

    >>la verdad las realizo desde el DGV porque me parece la forma mas fácil de validar ya que reviso el datagridview.Rows.Count==1

    pesima idea, si no vas a tener interacion con el usuario valida desde los datos directamente, crea una clase que retorne la informacion y usala, pero no lances un form

    el codigo que realiza el select a la db llevalo a una clase para poder reutilizarlo, usa una arquitectura la menos de 2 capas, como explico aqui

    [WinForms] Edición Empleados

    entonces valida los datos, NUNCA el grid sie s que no vas a listar esto al usuario

    eso de abrir un form, validar y cerrarlo es pesimo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 19 de abril de 2018 15:27
  • Ok, hay muchas cosas que no me gustan de ese código, pero como usted dice que no conoce otras formas, voy simplemente a darle 2 opciones:

    1. La variable dt que veo ahí es un DataTable.  Ese objeto tiene la propiedad Rows, que a su vez tiene la propiedad Count.  No ocupa el DGV.  Puede validar que hay datos haciendo if (dt.Rows.Count > 0).
    2. Si no va a hacer nada con los datos, en vez de hacer un SELECT TOP 10 de columnas, simplemente haga un SELECT COUNT(*) FROM ...  Entonces simplemente ejecutamos el código y leemos la primera celda de la primera fila del DataTable.

    Jose R. MCP
    Code Samples


    jueves, 19 de abril de 2018 15:33
    Moderador
  • He realizado la modificación que me indicas

     dt = new DataTable();
                    da.Fill(dt);
                    if(dt.Rows.Count > 1 )
                    {
                        Close();
                    }

    tomando que si es mayor que 1 es porque trajo encabezados y algún dato mas, se supone que esta bien y se puede cerrar, pero al ejecutar el close(); me genera el mismo problema

    me dice que el error esta acá

    public void button1_Click(object sender, EventArgs e)
            {
                
                Form frm = new frmARS();
                frm.Show();

                  }

    System.ObjectDisposedException: 'No se puede obtener acceso al objeto desechado.
    Nombre del objeto: 'frmARS'.'

    pero estoy casi seguro que como invoca el frmARS y el método que inicializa si esta bien lo cierra.

    jueves, 19 de abril de 2018 15:50
  • Es que ya no ocupa hacer el Show.  De hecho, ya no ocupa un formulario completo para eso.

    Mueva el código a una clase y desecha frmARS.


    Jose R. MCP
    Code Samples

    jueves, 19 de abril de 2018 15:51
    Moderador
  • hola

    >>tomando que si es mayor que 1 es porque trajo encabezados y algún dato mas, se supone que esta bien y se puede cerrar, pero al ejecutar el close(); me genera el mismo problema

    pero porque abres un form sino vas a queres una interaccion visual?, crea una clase para usarla desde el boton, no pongas ese codigo en un form, es una pesima idea

    despeus si desde el boton necesitas a veces mostrar el form y otras no, puede definirlo por configuracion, y cambiarlo segun necesites

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 19 de abril de 2018 15:53