Gente,
Me surgio un problema con winforms, no estoy acostumbrado mucho a este
mundo. Tengo una aplicacion hecha en el 2.0, y cuando el usuario presiona un
boton, corre un proceso de negocio (migracion de datos/etc..etc..etc/), el
mismo tarda varios minutos, esto produce que la aplicacion se freze, y diga
"no responde".
El tema que este mismo metodo que tiene este proceso tan costoso, va
mostrando a medida que avanza el estado de cada operacion, y tiene que
acceder a los controles del winform, y uno ves que termina, debe invocar a
otro mismo del metodo para notificar al usuario.

No se si entendieron un poco mi escenario, y sepan disculpar la sintaxis
pero lo escribi rapido al mail.
Les mando un ejemplo en lo que estoy intentando trabajar, cualquier tipo de
ayuda me vendria bien.

Gracias,
Saludos.


    /// <summary>
    /// Clase base intentando hacer algo de asincronismo.
    /// </summary>
    public class BaseForm : Form
    {

        protected virtual void Async(MethodInvoker action, MethodInvoker
nextStep)
        {

            new Thread(delegate()
                        {
                            Exception exception = null;
                            action();
                            ThreadSafe(nextStep);
                        }).Start();

        }

        protected virtual void ThreadSafe(MethodInvoker method)
        {
            if (InvokeRequired)
                Invoke(method);
            else

                method();
        }

    }
    public partial class Form1 : BaseForm
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        ///
        /// Evento del boton, hoy en dia cuandos se hace click aca, freza la
aplicacion, poniendo la
        /// barra de titulo blanca, y diciendo "no responde", despues de
mucho tiempo vuelve...
        /// pero da una mala sensacion al usuario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Async(ProcesodeNegocio, finish);
        }

        /// <summary>
        /// Este es un proceso de negocio que tarda mucho (varios minutos) y
que necesita actualizar
        /// algunos controles de la UI.
        /// </summary>
        private void ProcesodeNegocio()
        {
            this.button1.Enabled = false;
            int count = 0;
            while (count < 10)
            {
                count++;
                //Si o si tengo que ir mostrando el avance en la Interfaz de
Usuario
                // Puede tardar minutos
                this.textBox1.Text += count + Environment.NewLine;
                Thread.Sleep(1000);
            }
        }

        /// <summary>
        /// Metodo una vez terminado mi proceso de lote.
        /// </summary>
        private void finish()
        {
            MessageBox.Show("Termino el proceso de negocio");
            this.button1.Enabled = true;
        }
    }
--
Jose Franco

Reply via email to