我想了解有关学校任务的线程,我试图让两个线程清空集合。到目前为止,我提出的代码引发了一个异常,表示该集合已被修改。多线程修改集合
首先,我在锁定的代码部分有一个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()的错误。你拥有它的方式效果很好。 –