Я хотел провести некоторое тестирование с очередями и с помощью Queue.Synchronized, чтобы увидеть, как это работает, когда два потока помещают данные в очередь, а третий поток читает их. Это казалось довольно простым, но это не работает, и я не уверен, почему. Наверное, глупая ошибка с моей стороны. Однако есть кое-что еще.
class Program
{
public int this1 = 0;
static void Main(string[] args)
{
Tester test1 = new Tester();
Queue myQ = new Queue();
Tester.myQ = Queue.Synchronized(myQ);
Thread test1_thread = new Thread(new ThreadStart(test1.test1));
Thread test1_thread2 = new Thread(new ThreadStart(test1.test1));
test1_thread.Start();
test1_thread2.Start();
int i = 0;
while (i <= 10)
{
i++;
go_back_here:
try
{
Tester.myQ.Enqueue(40);
Console.WriteLine("did it");
int holding = Convert.ToInt32(Tester.myQ.Dequeue());
Console.WriteLine("reading out {0}: {1}", i);
}
catch
{
//Console.Write("e");
//goto go_back_here;
}
}
Console.ReadLine();
}
}
class Tester
{
public static Queue myQ;
public void test1()
{
int this1 = 0;
while (this1 <= 10)
{
Console.WriteLine("Doing something {0}", this1);
myQ.Enqueue(this1);
Console.WriteLine("(peek) {0}", myQ.Dequeue());
this1++;
}
}
}
В ходе моего собственного тестирования я обнаружил, что два потока тестера загружают данные в очередь нормально. Когда мой основной цикл пытался удалить его из очереди, я получал сообщение об ошибке, что очередь пуста. Я поместил пики, а затем Dequeues в потоки тестирования, и они смогли показать материал в потоке нормально.
Затем я подумал, не обращаюсь ли я каким-то образом к неправильной очереди из основного цикла (ООП не моя сильная сторона, все еще учусь it), поэтому я добавил "Tester.myQ.Enqueue (40);" чтобы посмотреть, смогу ли я что-нибудь в него воткнуть. Мои пики / Dequeues не показали этого, но он ДЕЙСТВИТЕЛЬНО появился, когда я добавил строку записи «сделал это». Я запускал программу множество раз, и 40 из основного цикла появляются только в потоках тестирования, распечатываемых из Dequeue, когда "
Есть идеи?
спасибо