.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(); 컨 수머 태스크가 실행 중이더라도 컬렉션에 계속 추가 할 수 있습니다. 그냥 collection.CompleteAdding(); 호출하십시오 collection.CompleteAdding(); 당신이 확신 할 때 더 이상 추가 사항이 없습니다. 이 기능을 사용하면 여러 소스가 BlockingCollection에 항목을 제공하고 단일 소비자가 항목을 가져 와서 항목을 처리하는 단일 소비자 패턴으로 여러 제작자를 만들 수 있습니다. 전체 추가를 호출하기 전에 BlockingCollection이 비어 있으면 collection.GetConsumingEnumerable() 의 Enumerable은 새 항목이 컬렉션에 추가되거나 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!");