1

Ok, ich habe eine DataGridView, die ich mit Daten laden möchte, die ich von einem SQLDataReader in einem Hintergrund-Worker abruft, wie die Daten kommen (es ist eine Abfrage, die lange dauert).VB.NET DataGridView lädt Daten von einem Hintergrund-Worker und SQLDataReader

Mein Ziel ist, dass die Benutzererfahrung der Suche nach einer Datei in Windows ähnlich ist, in der die Ergebnisse in der Liste angezeigt werden und sie mit dem Fenster interagieren können.

Ich habe es mit einem Hintergrund-Worker und Datenleser arbeiten und ich versuche, die Zeile aus dem SQLDataReader.Read mithilfe der BackgroundWorker.ReportProgress-Methode hinzuzufügen. Alles technisch funktioniert, aber das Flimmern ist verrückt und die Form ist unbrauchbar (wahrscheinlich nicht, weil der GUI-Thread blockiert ist, sondern nur, weil so viel los ist ...)

Irgendwelche Ideen? Wie mache ich das Laden der Datagridview "glatt"?

Antwort

0

Sie möchten die Geschwindigkeit drosseln, mit der ReportProgress aufgerufen wird. Nennen Sie es nicht für jede Zeile. Platzieren Sie stattdessen mehrere Zeilen und rufen Sie dann ReportProgress. Stellen Sie es so ein, dass das Ereignis ProgressChanged alle paar Sekunden ausgelöst wird.

Ehrlich gesagt, ist dies ein Szenario, in dem ich finde, dass BackgroundWorker zwingt Sie in ein schlechtes Design. Was ich tun würde ist, die BackgroundWorker zusammen aufzugeben und manuell eine neue Thread oder Task zu erstellen, um das Laden zu tun. Lassen Sie Ihren Arbeitsthread die Zeilen in eine Queue<T> oder eine andere Datenstruktur einreihen, und lassen Sie dann regelmäßig von Ihrem UI-Thread diese Warteschlange über ein System.Windows.Form.Timer auf dem für Sie am besten geeigneten Intervall abfragen. Der UI-Thread extrahiert eine vernünftige Anzahl von Zeilen und platziert sie im Raster, so dass sie nicht zu viel versucht und die UI auflegt, oder zu wenig, was ewig dauern würde.