Моя очередь ведет себя забавно, есть идеи, почему?

Я хотел провести некоторое тестирование с очередями и с помощью 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, когда "

Есть идеи?

спасибо

6
задан Marek Sapota 17 January 2011 в 16:08
поделиться