学校の課題のスレッドについて学習しようとしています。また、コレクションを空にするために2つのスレッドを取得しようとしています。私がこれまでに思いついたコードは、コレクションが変更されたという例外をスローします。
最初にロックされたコード部分にwhileループがありましたが、その後(もちろん;-))1つのスレッドだけがコレクションを空にします。
私の質問は、コレクションを空にする際に両方のスレッドが交互に繰り返されるループをどのように作成できるかということです。
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);
}
}
}