【发布时间】:2017-08-23 22:10:09
【问题描述】:
我正在尝试为我从控制器异步读取的数据流实现生产者/消费者模式。我想使用BlockingCollection<T> 这样做,但想确保我得到想要的结果。我的消费者看起来像这样:
// make sure there is actually some data in the buffer
if (!this.buffer.IsCompleted)
{
// attempt to read from the buffer
data = this.buffer.Take();
// construct the message object
message = this.ConvertToMessageObject(data);
}
IsCompleted 属性实际上会阻塞吗?因此,如果另一个线程要访问缓冲区,我希望它在调用 Take 方法之前等待并确保缓冲区实际上没有“完成”。
在我的应用程序中,期望的效果是允许我避免在缓冲区实际上为空时构造新的消息对象。所以这就是为什么我在去Take之前检查IsCompleted。
另外...我知道Take 方法不再阻塞一次IsAddingCompleted = true。因此,我不希望消费者从无效的 Take 方法中获取数据,因为它别无选择(如果消费者不知道已完成状态)。我认为我很难解释我在这里担心的事情......
【问题讨论】:
标签: c# blocking producer-consumer