Producer-consumer в C#
Схема producer-consumer разводит генерацию данных и их обработку: производитель кладёт элементы в буфер, потребитель забирает их в своём темпе. Так проще масштабировать стадии конвейера без общего изменяемого списка.
Класс BlockingCollection - очередь между потоками с ограниченным местом: Add блокируется, когда места нет, Take - когда очередь пуста. Для асинхронного кода чаще берут Channel, а здесь потоки синхронные, поэтому очередь блокирующая.
В примере producer кладёт два числа, consumer читает оба. Метод CompleteAdding сигнализирует, что новых элементов не будет; без него consumer может бесконечно ждать на Take:
using System.Collections.Concurrent;
BlockingCollection<int> queue = new();
Thread producer = new(() =>
{
queue.Add(3);
queue.Add(5);
queue.CompleteAdding();
});
producer.Start();
int sum = queue.Take() + queue.Take();
producer.Join();
Console.WriteLine(sum); // выведет 8
Запустите поток, который кладёт в блокирующую очередь строки "oak" и "pine" и сообщает, что новых элементов не будет. В главном потоке заберите обе строки и выведите их в консоль через пробел.