我想了解有關學校任務的線程,我試圖讓兩個線程清空集合。到目前爲止,我提出的代碼引發了一個異常,表示該集合已被修改。多線程修改集合
首先,我在鎖定的代碼部分有一個while循環,但是(當然;-))只有一個線程清空集合。
我的問題是,我怎麼能有一個循環,其中的線程輪流清空收集?
class Program
{
private static List<int> containers = new List<int>();
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
containers.Add(i);
}
Thread t1 = new Thread(() => { foreach (int container in containers) { GeefContainer(); } });
t1.Name = "Kraan 1";
t1.Start();
Thread t2 = new Thread(() => { foreach (int container in containers) { GeefContainer(); } });
t2.Name = "Kraan 2";
t2.Start();
Console.Write("Press any key to continue...");
Console.Read();
}
static void GeefContainer()
{
lock (containers)
{
int containerNummer = containers.Count - 1;
//Container container = containers[containerNummer];
//Console.Write("Container {0} opgehaald... Overladen", containerNummer);
Console.WriteLine("Schip: Container {0} gegeven aan {1}", containerNummer, Thread.CurrentThread.Name);
//Gevaarlijk, want methode aanroepen kan klappen
containers.RemoveAt(containerNummer);
}
}
}
我很抱歉,我是那個犯了錯誤的人。雖然,現在我修好了它,但我注意到只有線程1清空了這個集合。也許我應該在某個地方睡一覺? –
@ ImNotANumber.OhWait ... 0792588 - 對不起,我的壞。您確實需要讓線程等待來自其他線程的脈衝。簡單地把Wait語句放在循環的底部,看到我正在閱讀關於線程的修改代碼 – Polity
,以及http://www.albahari.com/threading/part4.aspx#_Signaling_with_Wait_and_Pulse上的等待和脈衝方法,並且它表示同樣的事情,雖然我犯了在Pulse()之前放置Wait()的錯誤。你擁有它的方式效果很好。 –