Tengo un gran text file
que contiene muchas líneas de datos. En mi aplicación, abro este archivo, leo cada línea haciendo coincidir una expresión regular y la visualizo en una vista de tabla de datos. El número total de filas generadas es de alrededor de 2000 (A veces incluso más, por lo que es bastante grande).Barra de progreso y carga de archivos
Por lo que para todas estas operaciones lleva bastante tiempo. Así que moví este código a otro hilo usando el trabajador de fondo y todo está bien, excepto que quiero mostrar el estado de carga en una barra de progreso donde estoy fallando.
He usado FileInfo
clase para obtener la longitud del archivo y luego le dio este valor al Progressbar.Maximum
. Parece que no es el enfoque correcto porque un archivo de prueba que contiene "3" líneas devolvió una longitud de archivo de "305". No entiendo cuánto intervalo de pasos debo dar de esta manera.
Ejemplo de código:
FileInfo ff = new FileInfo(openFileDialog1.FileName);
int fsize= Convert.ToInt32(ff.Length);
int val=1;
pgbar_load.Invoke(new MethodInvoker(delegate { pgbar_load.Maximum = fsize; }));
y en el bucle:
++val;
wk.ReportProgress(val);
y luego:
private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbar_load.Value = e.ProgressPercentage;
}
Así que dos cosas que estoy buscando:
- Configurando el valor máximo para la barra de progreso.
- Configuración correcta del índice de pasos.
Por favor sugierame una manera de seguir adelante.
¿Cómo puedo leer el total de bytes de lectura cada vez, me refiero al valor int totalRead? Lo primero es que leo todo el archivo y almaceno los datos en una lista genérica. Y luego, en un bucle, actualizo cada fila de la cuadrícula de datos donde estoy mostrando el progreso. – Cdeez
Puede echar un vistazo al código agregado en la pregunta de qué estoy haciendo. – Cdeez
Pocas ediciones de esta respuesta darán el resultado --- Los valores 'totalRead' y' totalFilesize' deben ser 'dobles', ya que si son enteros, el resultado es siempre un cero (un tipo de conversión del resultado a entero) y 100d * 0 = 0. Y es 'Math.Ceiling();' – Cdeez