Los Formularios Windows forms Roscado y Eventos - ListBox puntualmente las actualizaciones pero progressbar experiencias enorme retraso

StackOverflow https://stackoverflow.com/questions/12095

Pregunta

Nuestro equipo es la creación de un nuevo sistema de flujo de trabajo de contratación para sustituir a las antiguas.He sido encargado de la migración de los datos antiguos en el nuevo esquema.He decidido hacer esto mediante la creación de un pequeño proyecto de Formularios Windows forms como el esquema son radicalmente diferentes y recto TSQL scripts no son una solución adecuada.

La principal clase cerrada 'ImportController' que hace el trabajo que se declara el siguiente delegado evento:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

La ventana principal se inicia un método estático en la clase utilizando un nuevo hilo:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

el ImportProgressEvent args lleva un mensaje de cadena, max int valor para la barra de progreso y un progreso actual valor int.El formulario de Windows subcribes para el evento:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

Y responde a los eventos de esta manera el uso de su propio delegado:

    private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
            {
                this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
            }

Finalmente, la barra de progreso de listbox y se actualizan:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
        {
            string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in items)
            {
                this.lstTasks.Items.Add(item);
            }

            if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
            {
                this.ImportProgressBar.Maximum = progressMax;
                this.ImportProgressBar.Value = currentProgress;
            }
        }

La cosa es que el ListBox parece actualización muy rápidamente, pero la barra de progreso no se mueve hasta que el lote es casi completa de todos modos ???¿por qué ?

¿Fue útil?

Solución 4

@Juan

Gracias por los enlaces.

@Le

No hay ganancia de threadpooling como sé que sólo spawn de un hilo.El uso de un hilo es exclusivamente para tener una capacidad de respuesta de interfaz de usuario, mientras que SQL Server está siendo golpeado con lee y escribe.Ciertamente no es un corta el hilo.

Con respecto a sledge-martillos tienes razón.Pero, como resulta que mi problema era entre la pantalla y la silla, después de todo.Me parece que tienen un unusal lote de datos que tiene muchos más extranjeros clave de los registros de los otros lotes y sólo pasa a ser seleccionado temprano en el proceso que significa la currentProgress no consigue ++'d para un buen 10 segundos.

@Todos

Gracias por todos sus aportes, me puse a pensar, lo que me hizo buscar en otra parte del código, lo que llevó a mi ahaa momento de la humildad, donde me han demostrado una vez más el error suele humanos :)

Otros consejos

Tal vez usted puede tratar el componente BackgroundWorker.Se hace el roscado más fácil.Los ejemplos aquí:

Tal vez fuera de su alcance, pero, que a veces es útil hacer un Application.DoEvents(); para hacer la interfaz gráfica de usuario de partes de reaccionar a la entrada del usuario, tales como cancelar pulsando el botón en una barra de estado de diálogo.

¿Por casualidad ejecutar Windows Vista?Me he dado cuenta de la exactamente la misma cosa en algún trabajo relacionado con las aplicaciones.De alguna manera, parece ser que hay un retraso cuando la barra de progreso "anima".

¿Estás seguro de que el subproceso de interfaz de usuario se ejecuta libremente durante todo este proceso?es decir,es no estar bloqueados en una combinación o alguna otra que esperar?Eso es lo que se parece a mí.

La sugerencia de utilizar BackgroundWorker es un buen definitivamente superior a intentar sledge-hammer su manera de salir del problema con una carga de Actualización/Actualización de llamadas.

Y BackgroundWorker utilizará un grupo de rosca, que es una manera más amigable a comportarse de crear su propia vida corta el hilo.

No hay ganancia de threadpooling como Sé que sólo uno de spawn subproceso.El uso de un hilo es puramente para tener una capacidad de respuesta de interfaz de usuario, mientras que SQL El servidor está siendo golpeado con las lecturas y escribe.Ciertamente no es un corto vivió hilo.

OK, se lo agradezco, y me alegro de que encontró su error, pero has mirado en BackgroundWorker?Hace casi exactamente lo que usted está haciendo, pero en un estandarizada de la moda (es decir,sin sus propios delegados) y sin la necesidad de crear un nuevo hilo, que son dos (tal vez pequeño, pero tal vez todavía útil) ventajas.

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