none
backgroundworker en WPF con C# RRS feed

  • Pregunta

  • Estimados, he buscado en varios foros pero encuentro lo que quiero implementar en mi proyecto, les explico un poco de lo que quiero realizar con un backgroundworker 

    tengo el siguiente método:

    Este método se demora demasiado al ejecutarlo, y se bloquea la ventana(no responde) pasados un par de minutos se muestra en la nueva ventana el reporte.

    void Procesar(){

    datatable dt=new datatable();

    negocio neg01=new negocio();

    dt=neg01.Usp_procesarReporte();

    form1 frm=new form1;

    frm.showDialog();

    }

                                                                                      

     Según he leído en varios foros incluido este, se puede manejar con backgroundworker  para que la ventana que ejecuta este método no se bloquee(no responde). y me informe el avance  de la consulta. Pero no veo la forma de como aplicarlo.

    Alguien me podría ayudar con este tema, de antemano les doy las gracias


     
    jueves, 25 de junio de 2015 5:26

Respuestas

  • hola

    pero cual seria el sentido de obtener los datos que cargan un datatable que despues no usas

    porque alli veo que estas lanzando un form que no hace uso del datatable

    podrias desde el evento DoWork cargar el datatable, pero no es recomendable que lances desde alli el form

    salvo que lo realices desde el RunWorkComplete

    BackgroundWorker (Componente)

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Robin Ramirez sábado, 27 de junio de 2015 13:59
    jueves, 25 de junio de 2015 17:28
  • Sí, el backgroundworker puede valer, pero hay que tener más cuidado del que parece al usarlo. El código ejecutado en el BackgroundWorker rueda en un hilo separado, y no es lícito que desde otro hilo se modifique la interfaz del usuario. Entre otras cosas, esto implica que desde otro hilo no puedes modificar un datatable que tenga un binding con elementos de la interfaz de usuario.

    Por lo tanto, se puede mover al DoWork del BackgroundWorker la parte que hace DataTable dt=neg01.Usp_procesarReporte();, que presumiblemente es la que resulta lenta. Pero el resto, es decir, el new Form1, asignarle dt al datacontext, y form1.Show, deben de hacerse FUERA del BackgroundWorker. El sitio razonable para hacerlo es en el evento RunWorkerCompeted, que puede devolver el dt a través de sus parámetros.

    • Marcado como respuesta Robin Ramirez sábado, 27 de junio de 2015 13:59
    viernes, 26 de junio de 2015 12:18

Todas las respuestas

  • hola

    pero cual seria el sentido de obtener los datos que cargan un datatable que despues no usas

    porque alli veo que estas lanzando un form que no hace uso del datatable

    podrias desde el evento DoWork cargar el datatable, pero no es recomendable que lances desde alli el form

    salvo que lo realices desde el RunWorkComplete

    BackgroundWorker (Componente)

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Robin Ramirez sábado, 27 de junio de 2015 13:59
    jueves, 25 de junio de 2015 17:28
  • Estimado, gracias por la respuesta, el codigo es como sigue

    void Procesar(){

    datatable dt=new datatable();

    negocio neg01=new negocio();

    variablePublica.dt=neg01.Usp_procesarReporte();

    form1 frm=new form1;

    frm.datagrid.DataContext=variablePublica.dt;

    frm.showDialog();

    }

    este proceso demora como 2 min en procesar y la ventana aparace el mensaje (no responde), como evitar que se bloquee la ventana, si es posible que muestre una barrar de progreso en marke, pero no tengo idea como implementarlo espero me puedar ayudar amigo... :)

    jueves, 25 de junio de 2015 23:41
  • Hola Robin Ramirez podrías programarlo como tu mismo dices, backgroundworker, podrías guiarte del siguiente ejemplo que muestran aquí:

    Background Worker in WPF

    Espero haberte ayudado.

    viernes, 26 de junio de 2015 3:53
  • Sí, el backgroundworker puede valer, pero hay que tener más cuidado del que parece al usarlo. El código ejecutado en el BackgroundWorker rueda en un hilo separado, y no es lícito que desde otro hilo se modifique la interfaz del usuario. Entre otras cosas, esto implica que desde otro hilo no puedes modificar un datatable que tenga un binding con elementos de la interfaz de usuario.

    Por lo tanto, se puede mover al DoWork del BackgroundWorker la parte que hace DataTable dt=neg01.Usp_procesarReporte();, que presumiblemente es la que resulta lenta. Pero el resto, es decir, el new Form1, asignarle dt al datacontext, y form1.Show, deben de hacerse FUERA del BackgroundWorker. El sitio razonable para hacerlo es en el evento RunWorkerCompeted, que puede devolver el dt a través de sus parámetros.

    • Marcado como respuesta Robin Ramirez sábado, 27 de junio de 2015 13:59
    viernes, 26 de junio de 2015 12:18