【问题标题】:.NET Consumer/Producer (Queue).NET 消费者/生产者(队列)
【发布时间】:2012-01-28 05:40:24
【问题描述】:

我是 .NET/Threads 的新手,我想知道是否有人可以帮助我完成这个练习。我需要更换 cmets 以使其在不锁定线程的情况下工作:

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 表示在寻求帮助之前尝试解决问题。真的很巧妙地问了问题!

标签: .net locking queue consumer producer


【解决方案1】:

与其自己努力实现同步,不如看看BlockingCollection。它为您处理所有同步,并且比您可以使用Queue 类和Monitor 创建的任何东西都执行得更好。

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

【讨论】:

  • 如果目标是构建队列,不妨使用 ConcurrentQueue:msdn.microsoft.com/en-us/library/dd267265.aspx
  • @Mathias: BlockingCollection 是一个更通用的接口,默认情况下使用ConcurrentQueue 作为其后备存储。我还没有遇到过最好单独使用ConcurrentQueue 的案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多