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