.NET Consumer / Producer(队列)

时间:2011-12-27 00:27:47

标签: .net locking queue consumer producer

我是.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 个答案:

答案 0 :(得分:1)

不要自己努力实现同步,而是看看BlockingCollection。它为您处理所有同步,并且比使用Queue类和Monitor创建的任何内容都要好。

.NET文档中有很多示例,这里有Stack Overflow和其他地方。您可能会发现我的文章很有用:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821