Die Listview schnurrt nun endlich und vom ruckeln keine Spur.
Die Anwendung stürzte ab, weil ich mich mit dem Threadpool geirrt hatte. Ich dachte, dort wird erst ein Thread gestartet, sobald die Funktion beendet wurde. Weil nun mehrere gleiche Threads parallel liefen, gabs Probleme bei der Bitmapmanipulation.
Lösung:
Einen(!) Thread beim Wechsel der Daten starten. Dieser fragt per While eine Liste mit Indexern ab, die bereits von der Listview und dessen Daten verarbeitet wurde.
Der Hauptthread kann durch einen Synchronisationkontext aktuallisiert werden, dessen Instanz im Hauptthread gestartet werden muss.
Nachvollgender Code ist noch nicht optimiert, also ein Test , funktioniert aber.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| private void GetThumbnail() { int indexNumber = 1; int indexCounter = 0;
while (true) { if(BrowserData.ImgIndexer.Count >= indexNumber) { FileInfo file = BrowserData.Files[BrowserData.ImgIndexer[indexCounter]]; Bitmap bmap = ImageLoader.GetThumbnailImage(file.FullName);
synchronizationContext.Post(o => FillImgList(new string[] { file.Name, file.FullName }, bmap), null);
indexNumber++; indexCounter++; Thread.Sleep(500); } else { Thread.Sleep(500); continue; } } }
private void FillImgList(object fileData, Bitmap bmap) { string[] strData = (string[])fileData; Image previousImage = imgListLarge.Images[imgListLarge.Images.Keys.IndexOf(strData[0])];
imgListLarge.Images.RemoveByKey(strData[0]); previousImage.Dispose(); imgListLarge.Images.Add(strData[0], bmap); } |