代码之家  ›  专栏  ›  技术社区  ›  Steve

如何使用C#TPL告诉生产者不要在生产者-消费者模式中等待

  •  1
  • Steve  · 技术社区  · 15 年前

    我有一个任务,负责为BlockingCollection生成作业。这个集合有一个容量限制,比如说,最多3个工作。我有两个使用者任务,他们试图从集合中获取作业并执行它们。我还实现了对生产者和消费者的取消。对于producer,当它检测到取消时,它将调用阻止集合。完成添加(),允许消费者完成等待。

    现在有可能:

    时间1:制作人在集合中放置2个工作;

    第二次:两个消费者抢了饭碗自己跑;

    第三次:制作人把另外3份工作放进收藏。因为它满足了收集的能力,生产者就睡着了;

    时间4:取消发生在两个消费者身上。他们停下来了。

    我能想到的是把下面的代码放到消费者的取消处理程序中。

    lock(BlockingCollection){
        if(BlockingCollection.BoundedCapacity == BlockingCollection.Count) BlockingCollection.Take();
    }
    

    1 回复  |  直到 15 年前
        1
  •  1
  •   Anthony Williams    15 年前

    我会使用 Add http://msdn.microsoft.com/en-us/library/dd381879.aspx

    当您取消消费者时,您还可以通过同时或在消费者线程中触发取消令牌来确保生产者被取消。