var buffer = new BufferBlock<object>();
var producer = Task.Run(async () =>
{
while (true)
{
await Task.Delay(TimeSpan.FromMilliseconds(100));
buffer.Post(null);
Console.WriteLine("Post " + buffer.Count);
}
});
var consumer = Task.Run(async () =>
{
while (await buffer.OutputAvailableAsync())
{
IList<object> items;
buffer.TryReceiveAll(out items);
Console.WriteLine("TryReceiveAll " + buffer.Count);
}
});
await Task.WhenAll(consumer, producer);
生产者应该每隔100毫秒将物品发布到缓冲区,消费者应该清除缓冲区中的所有物品,并异步等待更多物品出现。实际发生的情况是,生产者只清除所有物品一次,然后再也没有移动过 `OutputAvailableAsync`。如果我将消费者切换为逐个删除物品,则它可以按预期工作:
while (await buffer.OutputAvailableAsync())
{
object item;
while (buffer.TryReceive(out item)) ;
}
我是否有什么误解?如果没有,问题出在哪里?