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