Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpCcPc 386 of 509 menu
◀ ▶

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" и сообщает, что новых элементов не будет. В главном потоке заберите обе строки и выведите их в консоль через пробел.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить