Pregunta

Estoy intentando utilizar un objeto Microsoft.SqlServer.Management.Smo.Restore para restaurar una base de datos SQL Server 2000. Justo antes de comenzar la operación de restauración, cambio el texto de una etiqueta para que el usuario sepa lo que está sucediendo. Sin embargo, el texto modificado no es visible en la GUI (es decir, el texto permanece igual) hasta DESPUÉS de la línea fullRestore.Wait ().

lblStatus.Text = "Restoring Database";
Restore fullRestore = new Restore(); 

// Configure fullRestore

fullRestore.SqlRestore(_server);
fullRestore.Wait();

Lo extraño es que lblStatus finalmente muestra " Restaurando la base de datos " ;, pero no hasta después de que la restauración se haya completado. ¿Alguna idea?

¿Fue útil?

Solución

Estás bloqueando el hilo de la GUI, lo que impide que se actualice. Puede llamar a lblStatus.Refresh (), o mover su Wait a un hilo de fondo (que en última instancia es lo correcto).

Otros consejos

Es un problema de subprocesos. Puede hacer esto en hilos separados o en un hilo de fondo. Un enfoque que he visto que la gente usa es hacer Application.DoEvents () aunque normalmente me mantengo alejado de esa llamada.

La actualización de la GUI no puede ocurrir hasta que haya finalizado el procesamiento en el subproceso en primer plano y lo haya liberado. Debe realizar la restauración en un subproceso en segundo plano para permitir que el subproceso en primer plano continúe actualizando la GUI. Considere colocar el código de restauración en un método separado y usar ThreadPool .QueueUserWorkItem () , y pasando el método de restauración. Esto activará su método de restauración en un subproceso de grupo de subprocesos.

Si necesita más control sobre el hilo y la notificación cuando haya terminado, puede usar un BackgroundWorker

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top