Podés utilizar un control del tipo BackGroundWorker que te resuelve toda esa 
temática. 

Lo vas a encontrar en la Toolbox del Visual Studio à Components, de ahí 
arrastrás una instancia al formulario y usás el metodo Do_Work() y sus eventos 
ProgressChanged y RunWorkercompleted.

Saludos !!!!!

Mariano F. López
Desarrollo de sistemas
marianolo...@yahoo.com <blocked::mailto:mlo...@boston.com.ar> 
http://www.facebook.com/marianoefe <http://www.facebook.com/marianoefe> 



 

De: c...@mug.org.ar [mailto:c...@mug.org.ar] En nombre de José Franco
Enviado el: viernes, 24 de septiembre de 2010 11:29 a.m.
Para: Lopez, Mariano F. | Boston
Asunto: [c#] Consulta Winforms

 

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



*******************************************************************************************

Este mensaje y todos los archivos adjuntos a el son para uso exclusivo del 
destinatario y pueden contener informacion confidencial o propietaria, cuya 
divulgacion es sancionada por ley.

Si usted recibio este mensaje erroneamente, por favor notifiquenos respondiendo 
al remitente, borre el mensaje original y destruya las copias (impresas o 
grabadas en cualquier medio magnetico) que pueda haber realizado del mismo.

Todas las opiniones contenidas en este mail son propias del autor del mensaje y 
no necesariamente coinciden con las de Boston Compañía Argentina de Seguros 
S.A. o alguna de las empresas accionistas. La publicacion, uso, copia e 
impresion total o parcial de este mensaje o documentos adjuntos queda prohibida.

Muchas gracias

Boston Compañía Argentina de Seguros S.A.

*******************************************************************************************

This message and any attachments are for exclusive usage of an addressee and 
may contain confidential or privileged information whose disclosure is subject 
to penalty by law.

If you are not the addressee, please notify the sender by return e-mail, delete 
the original message and destroy any existing copy no matter if printed or 
recorded.

Any opinions contained in this e-mail are those of the author of the message 
and do not necessarily coincide with those of Boston Compañía Argentina de 
Seguros S.A. or its shareholders. No part of this message or attachments may be 
used or reproduced in any manner whatsoever.

Thank you

Boston Compañía Argentina de Seguros S.A.

Responder a