No es un problema de subprocesamiento, sino un problema de interfaz de usuario del navegador web. Desea que el navegador muestre el estado mientras está trabajando en el servidor. En teoría, usted podría hacer algo como:
Response.Write("something");
Response.Flush();
pero el Flush()
no va a garantizar el navegador en realidad hace que su código en ese momento. En realidad, no puede controlar cómo se almacenan en caché/fragmentados/almacenados en memoria caché los datos en curso desde el servidor al navegador. Entonces, cada actualización debe ser una transacción http 'completa'.
Una forma, y común, es utilizar AJAX para lograr esto. El usuario hace clic en un botón que inicia un trabajo en segundo plano, y usted tiene un temporizador de javascript que sondea (realiza solicitudes) para verificar el estado del trabajo y actualiza el navegador del cliente.
Consulte Real-Time Progress Bar With ASP.NET AJAX para hacer un indicador de progreso ajax con ajax y .net.
Hay un excelente ejemplo de cómo crear una barra de progreso con un controlador HTTP en este artículo: http://www.asp101.com/articles/matt/progressbar/default.asp
Para probar mi punto, el siguiente código funciona en Firefox, pero no en IE o Chrome:
protected void Page_Load(object sender, EventArgs e)
{
Response.Buffer = false;
Response.Clear();
Response.Write("<html><body>");
Response.Write("1\n");
Response.Flush();
Thread.Sleep(2000);
Response.Write("1\n");
Response.Flush();
Thread.Sleep(2000);
Response.Write("1\n");
Response.Flush();
Thread.Sleep(2000);
Response.Write("1\n");
Response.Flush();
Response.Write("</body></html>");
Response.End();
}
He visto una manera muy ordenada de usar hilos antes ... Simplemente no puedo recordar dónde y cómo hacerlo. Básicamente se inició un método en ejecución, y de vez en cuando, se muestra el siguiente mensaje de progreso – Danny
Su trabajo se ejecutará en un hilo que actualiza su estado de progreso. Entonces su cliente hará una encuesta para conocer el estado. Pero como ya mencioné, en teoría podría terminar el trabajo en un hilo y escribir el progreso con Response.Write y Response.Flush, pero no se garantiza que en realidad se vacíe en el navegador y se represente antes de que finalice toda la solicitud. –
No creo que Response.Write funcione en un hilo. Sin embargo, algo está volviendo al elemento que vi antes, y creo que puede haber usado AJAX para agrupar el lado del cliente de estado. – Danny