Работая над ответом на этот вопрос, я написал этот фрагмент:
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)) ;
}
Я что-то не понимаю? Если нет, в чем проблема?