Hallo,
ich führe Code in einem Workerthread aus und möchte in diesem auch auf eine Control zugreifen. Ich weiß auch, wie man Controls invoked, jedoch weiß ich nicht, wie ich es bei einem foreach Loop machen soll.
Wird mein Code so ausgeführt wie unten, meckert er natürlich wegen Threadübergreifendem Zugriff.
Vielen Dank, für die Hilfe !
Hier ist mein Code :
lvStart = ListView
foreach (ListViewItem item in lvStart.Items) // <- Hier meckert er
{
if (item.Tag == n.ToString())
{
lvStart.Invoke((MethodInvoker)(() => lvStart.Items.Remove(item)));
}
}
Warum willst du eine GUI aktion in einem WorkerThread ausführen?
Invokes erzeugen viel overhead dh. einmal invoken und die schleife wieder im GUI Thread ausführen.
this.Invoke(new Action(()=>
{
foreach....
});
Hallo SPYMAN,
mit foreach geht es gar nicht, außer man verlagert das ganze foreach in den GUI-Thread, wie Console32 es gezeigt hat, denn kein GUI-Zugriff darf direkt aus dem Worker erfolgen, also auch nicht der auf lvStart.Items.
Aber natürlich kann man aus dem Worker einen Counter übergeben, welcher Item als nächstes geprüft werden soll. Allerdings sollte man mehrere Zugriffe zusammenfassen.
Aber das und auch ansonsten alles, was du wissen musst, steht in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.
herbivore