Ich habe einen einfachen Code:C# Timer und synchrononization Primitiven
public partial class Form1 : Form
{
Random rng = new Random();
List<int> list = new List<int>();
static object lockObject = new object();
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
lock (lockObject)
{
foreach (int number in list) //Exception appears here
if (number > 10)
list.Remove(number);
}
}
private void button1_Click(object sender, EventArgs e)
{
lock (lockObject)
{
list.Add(rng.Next(20));
}
}
}
Dieser Code funktioniert nicht: manchmal foreach
Aussage wirft System.InvalidOperationException: Die Auflistung wurde geändert. Das bedeutet, dass lock
Anweisung nicht funktioniert. Ich habe versucht, es mit Semaphore
Objekt ohne Wirkung zu ersetzen.
Wie kann ich sicherstellen, dass verschiedene Codeabschnitte list
nicht gleichzeitig ändern? Warum funktioniert lock
und Semaphore
nicht in diesem Code?
UPD: Ich habe nicht so offensichtlichen Fehler gesehen, sorry. Ich dachte, die Ausnahme wurde durch Einfügung verursacht, während foreach
, und habe nicht bemerkt list.Remove(number);
. Danke für deine Antworten!
Sie können eine Sammlung nicht ändern, während über sie iterieren. – dcg
@ dcg Ich weiß. Ich möchte wissen, wie sichergestellt werden kann, dass die Sammlung nicht geändert wird, während ich darüber iteriere. – AndrewR
@AndrewR Sie sichern es, indem Sie es nicht tun? – FakeCaleb