Ich benutze file.readalllines, um die Datei in eine Zeichenfolge zu lesen, dann listbox.items.addrange und split von vbcrlf, um die Elemente einzufügen. Gibt es eine Möglichkeit, die Verzögerung beim Laden großer Listen zu reduzieren?VB.NET: Gibt es eine Möglichkeit, die Verzögerung beim Laden einer riesigen Liste von Textzeilen in eine Listbox zu reduzieren?
Antwort
Verwenden Sie die Methoden BeginUpdate und EndUpdate; Dadurch wird das erneute Zeichnen der Listbox vorübergehend deaktiviert und der Prozess des Auffüllens beschleunigt.
ListBox1.BeginUpdate()
' fill the list using Items.Add or Items.AddRange '
ListBox1.EndUpdate()
Da die Datei, um sie durch das Lesen atomar zu verursachen unresposiveness groß genug ist, so scheint es, dass Sie in einem separaten Thread sollte das Lesen zu tun.
Ein Thread-Pool-Element sollte hier die Aufgabe erledigen. Versuchen Sie folgendes:
ThreadPool.QueueUserWorkItem((state) =>
using(var streamReader = new StreamReader("foo.txt"))
{
string line;
while ((line = streamReader.ReadLine()) != null)
listBox.Invoke(() => listBox.Items.Add(line));
})
(My VB.NET ein wenig eingerostet ist, also wenn jemand, dass umwandeln könnte, dass wäre hilfreich.)
jedoch die Tatsache, dass Sie Invoke
nennen die überqueren Thread-Grenze, um die GUI zu aktualisieren bedeutet, dass Ihre Leistung wird tatsächlich sinken, obwohl Sie zumindest normale Reaktionsfähigkeit mit der Benutzeroberfläche bekommen!
Die andere offensichtliche Option ist die Verwendung von BackgroundWorker
, die lange Aufgaben im Hintergrund in UI-Anwendungen ausführen soll. Ich bin mir jedoch nicht sicher, ob es in diesem Fall irgendwelche Vorteile bietet, und ein einfacher Thread-Pool-Artikel wäre wesentlich einfacher und ermöglicht es Ihnen, alles inline zu machen.
Sie können versuchen, die Listbox mit einem anderen Thread zu füllen. Dadurch wird das "Hängen" vermieden, wodurch der Benutzer mit den anderen Formularsteuerelementen interagieren kann. Sie können Itens auch teilweise laden, anstatt alle Daten gleichzeitig zu laden.
Verwenden Sie einen BackgroundWorker und laden Sie die Datei in einem separaten Thread. Seien Sie vorsichtig beim Hinzufügen der Zeilen zur ListBox aus dem Thread. Sie müssen die Artikel aus dem richtigen Thread veröffentlichen.
file.readalllines die Datei in einen String
Nein zu lesen! File.ReadAlllines liest in eine Zeichenfolge Array.
Spaltung von vbcrlf
So ist dies bereits für Sie erledigt: Sie ein paar zusätzliche Arbeit für nichts zu tun.
Ja, das war der Teil wo ich mich gefragt habe was er wirklich macht :) – VVS
Auch wenn Sie die Daten in ein Array von Strings in einem anderen Thread lesen möchten, würde ich vorschlagen, dass das Auffüllen der ListBox wahrscheinlich eine einzige Aktion im UI-Thread sein sollte. Wenn die Anzahl der Elemente so groß ist, dass die Verzögerung lediglich zum Füllen der ListBox mit einem AddRange inakzeptabel wäre, würde es unwahrscheinlich erscheinen, dass Benutzer in der Lage wären, in nützlicher Weise mit dem Steuerelement zu interagieren.
Dies wird mit Geschwindigkeit, aber nicht Reaktionsfähigkeit natürlich helfen. Wenn die Datei ausreichend groß ist, gibt es keinen wirklichen Grund, dies zu tun. – Noldorin