Ich möchte ein Element zu einer Listbox in einem Formular hinzufügen, blättern Sie es bis zum letzten Eintrag und aktualisieren Sie es dann. Ich würde das gerne in einer parallelen ForEach-Schleife machen.
Dazu habe ich online eine Erweiterungsmethode gefunden und nach meinen Bedürfnissen geändert. Jetzt erhalte ich die Fehlermeldung: "Cross-Thread-Operation nicht gültig: Control 'listBox1' zugegriffen von einem anderen Thread als der Thread, auf dem es erstellt wurde.". Ich verstehe den Fehler, dass ein funktionierender Thread versucht, auf die ListBox zuzugreifen. In der Tat kann ich sehen, dass der Haupt-Thread die ListBox vor dem Empfang des Fehlers aktualisieren kann. Auch der Debugger sagt mir, dass der Fehler in der Zeile "int visibleItems ..." steht.
Wie kann das gemacht werden?So fügen Sie zu ListBox thread safe (über Erweiterungsmethode) hinzu
public static class MyClass
{
public static void AddItemThreadSafe(this System.Windows.Forms.ListBox lb, object item)
{
int visibleItems = lb.ClientSize.Height/lb.ItemHeight;
if (lb.InvokeRequired)
{
lb.Invoke(new MethodInvoker(delegate
{
lb.Items.Add(item);
lb.TopIndex = Math.Max(lb.Items.Count - visibleItems + 1, 0);
lb.Refresh();
}));
}
else
{
lb.Items.Add(item);
lb.TopIndex = Math.Max(lb.Items.Count - visibleItems + 1, 0);
lb.Refresh();
}
}
}
versuchen, eine erklären Variable "visibleItems" in einem Delegate-Block und innerhalb der anderen Uhr. ja, Code-Duplizierung, aber sollte funktionieren – Pyfhon
versuchen [MethodImpl (MethodImplOptions.Synchronized)] über die Funktion 'AddItemThreadSafe' –
Ich versuchte [MethodImpl (MethodImplOptions.Synchronized)], aber es löst das Problem nicht. Ich habe auch "visibleItems" in den Delegate-Block verschoben, aber diese Änderung führt dazu, dass das Programm einfriert. – Manngo