Looking for .net Keywords? Try Ask4Keywords

.NET Framework Базовая цепочка производителей-потребителей (BlockingCollection)


пример

var collection = new BlockingCollection<int>(5);
var random = new Random();

var producerTask = Task.Run(() => {
    for(int item=1; item<=10; item++) 
    {
        collection.Add(item);
        Console.WriteLine("Produced: " + item);
        Thread.Sleep(random.Next(10,1000));
    }
    collection.CompleteAdding();
    Console.WriteLine("Producer completed!");
});

Стоит отметить, что если вы не вызываете collection.CompleteAdding(); , вы можете продолжать добавлять коллекцию, даже если ваша потребительская задача запущена. Просто вызовите collection.CompleteAdding(); когда вы уверены, что больше нет дополнений. Эта функциональность может быть использована для того, чтобы сделать несколько производителей одним шаблоном потребителя, где у вас есть несколько источников, которые подают элементы в BlockingCollection, и один потребитель вытаскивает предметы и что-то делает с ними. Если ваш BlockingCollection пуст перед вызовом полного добавления, Enumerable from collection.GetConsumingEnumerable() будет блокироваться до добавления нового элемента в коллекцию или BlockingCollection.CompleteAdding (); и очередь пуста.

var consumerTask = Task.Run(() => {
    foreach(var item in collection.GetConsumingEnumerable())
    {
        Console.WriteLine("Consumed: " + item);
        Thread.Sleep(random.Next(10,1000));
    }
    Console.WriteLine("Consumer completed!");
});
  
Task.WaitAll(producerTask, consumerTask);
       
Console.WriteLine("Everything completed!");