Ich habe eine große text file
enthält viele Zeilen von Daten. In meiner Anwendung öffne ich diese Datei, lese jede Zeile nach einem regulären Ausdruck und zeige sie in einer Datagridview an. Die Gesamtzahl der erzeugten Zeilen beträgt etwa 2000 (Manchmal sogar mehr, so ziemlich riesig).Fortschrittsbalken und Datei laden
Also für alle diese Operationen dauert es ziemlich viel Zeit. Also habe ich diesen Code mit Hintergrundarbeiter in einen anderen Thread verschoben, und alles ist in Ordnung, außer dass ich den Ladezustand in einer Fortschrittsleiste anzeigen möchte, in der ich versage.
Ich habe FileInfo
Klasse verwendet, um die Dateilänge zu erhalten und gab dann diesen Wert an die Progressbar.Maximum
. Scheint nicht der richtige Ansatz, weil eine Testdatei, die "3" Zeilen enthält, eine Dateilänge von "305" zurückgegeben hat. Ich verstehe nicht, wie viel Schritt Intervall ich auf diese Weise geben sollte.
Codebeispiel:
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; }));
und in der Schleife:
++val;
wk.ReportProgress(val);
und dann:
private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbar_load.Value = e.ProgressPercentage;
}
Also zwei Dinge, die ich bin auf der Suche nach:
- Einstellung des Maximalwerts für die Fortschrittsanzeige.
- Schritt-Index richtig einstellen.
Bitte schlagen Sie mir einen Weg vor, weiterzugehen.
Wie kann ich die gesamten gelesenen Bytes jedes Mal lesen, ich meine den int totalRead Wert? Die Sache ist zunächst, ich lese alle Dateien und speichern Sie die Daten in einer generischen Liste. Und dann in einer Schleife aktualisiere ich jede Zeile des Datagrids, wo ich den Fortschritt zeige. – Cdeez
Sie können den hinzugefügten Code in der Frage sehen, was ich tue. – Cdeez
Wenige Änderungen an dieser Antwort werden das Ergebnis geben --- Die 'totalRead' und' totalFilesize' sollten 'double' Werte sein, da, wenn sie Ganzzahlen sind, das Ergebnis immer eine Null ist (eine Typumwandlung des Ergebnisses in eine ganze Zahl)) und 100d * 0 = 0. Und seine 'Math.Ceiling();' – Cdeez