Otra opción es usar un delegado asíncrono para mostrar el formulario en una cadena de subprocesos.
Los subprocesos en el grupo de subprocesos se recomiendan para subprocesos de vida más corta que no duran toda la duración de la aplicación. Como se trata de mostrar una ventana de espera de corta duración, el grupo de subprocesos es una opción razonable.
El delegado de acción (.NET 2.0+) se utiliza junto con su método BeginInvoke() para ejecutar automáticamente el código de delegado en una secuencia de subprocesos.
Algunas notas:
- Es importante utilizar Control.BeginInvoke para cualquier llamada GUI hilo cruzado, tales como cerrar el formulario por favor espere en ClosePleaseWait().
- Además, el
m_pleaseWaitForm.ShowDialog();
realmente inicia un nuevo bucle de mensaje en el nuevo hilo. Esto es lo que mantiene vivo el formulario de espera por favor.
- Como se utiliza un hilo de subprocesos, este subproceso se convierte automáticamente en un subproceso en segundo plano y finalizará si la aplicación principal está cerrada.
- Además de ejecutar en otro hilo, no hay nada especial acerca de Form2. Puede colocar controles secundarios como Pictureboxes, etiquetas, etc.
(MethodInvoker)delegate { ... }
es solo una forma .NET 2.0 de ejecutar código en un delegado en línea.
El siguiente ejemplo se puede agregar a un proyecto de WinForms que contiene Form1: el formulario principal, y Form2: el formulario de espera por favor.
private Form2 m_pleaseWaitForm = null;
private void Form1_Shown(object sender, EventArgs e)
{
// This code could also be placed in eg. a button click event handler.
Action<Rectangle> a = new Action<Rectangle>(ShowPleaseWait);
a.BeginInvoke(this.Bounds, null, null);
// Do your long running tasks
ClosePleaseWait();
}
private void ShowPleaseWait(Rectangle bounds)
{
// This method runs on the new thread.
m_pleaseWaitForm = new Form2();
m_pleaseWaitForm.TopMost = true;
m_pleaseWaitForm.Location = new Point(bounds.Left + bounds.Width/2 - m_pleaseWaitForm.Width/2, bounds.Top + bounds.Height/2 - m_pleaseWaitForm.Height/2);
m_pleaseWaitForm.ShowDialog();
}
private void ClosePleaseWait()
{
m_pleaseWaitForm.BeginInvoke((MethodInvoker)delegate { m_pleaseWaitForm.Close(); });
}
Es esto realmente formularios web, o se trata de winforms? Estás hablando de Excel y VSTO. y si se trata de formularios web, no tiene un método de actualización. –
Lo sentimos, sí, Winforms, no Webforms .. He editado la pregunta ... Ha sido un día largo ... –
¿Alguna solución final con el código fuente completo de la muestra? ¿Qué hay de usar el proceso de larga ejecución con los pasos usando C#, SignalR? – Kiquenet