Потребитель / Производитель .NET (Очередь) - PullRequest
3 голосов
/ 27 декабря 2011

Я новичок в .NET / Threads, и я хотел бы знать, может ли кто-нибудь помочь мне в этом упражнении.Мне нужно заменить комментарии, чтобы они работали без блокировки потоков:

private Queue<int> queue;

public void ConsumeFunc(){
    while (true){
        // 1
        while (/* 2 */){
        // 3
        }
        int element = queue.Dequeue();
        // 4
        Console.WriteLine("Consume element: " + element);
        Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
    }
}

private void ProduceFunc(){
    while (true) {
        // 1
        queue.Enqueue(DateTime.Now.Millisecond);
        // 2
        // 3
        Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
    }
}

Мне удалось, но это не завершено

public void ConsumerFunc(){
    while (true){
        Monitor.PulseAll(queue);    // 1
        while (queue.Count == 0){   /* 2 */
            Monitor.Wait(queue);    // 3
        }
        int element = queue.Dequeue();
        lock (queue)    // 4
        Console.WriteLine("Consume element: " + element);
        Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000);
    }
}


public void ProducerFunc(){
    while (true) {
        lock (queue)    // 1
        queue.Enqueue(DateTime.Now.Millisecond);
        Monitor.PulseAll(queue);    // 2
        // 3 ???
        Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 3) * 1000);
    }
}

и выдает следующую ошибку: Метод синхронизации объекта был вызван из несинхронизированного блока кода , Monitor.PulseAll(queue);

1 Ответ

1 голос
/ 27 декабря 2011

Вместо того, чтобы бороться за реализацию синхронизации самостоятельно, взгляните на BlockingCollection . Он обрабатывает всю синхронизацию за вас и будет работать лучше, чем все, что вы можете создать, используя класс Queue и Monitor.

Существует множество примеров в документации .NET, здесь, о переполнении стека и в других местах. Вы можете найти мою статью полезной: http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

...