.NET 4.0 BlockingCollection을 사용하여 각 항목을 처리하는 데 최대 1 초가 걸릴 수있는 작업으로 처리해야하는 항목 큐를 처리하고 있습니다. 이 항목 대기열은 다른 스레드에 의해 추가 될 수 있습니다.여러 소비자 및 C# BlockingCollection 쿼리
나는이 과 관련하여 몇 가지 질문이 있습니다. a)이 소비자는이 BlockingCollection에서 작업 할 수 있습니까? 단일 소비자 시나리오에 적용 할 수있는 GetConsumingEnumerable()을 발견했습니다. 여러 소비자가있는 이유는 명명 된 파이프 인스턴스를 통한 처리가 한 번에 최대 3 개까지 처리 할 수 있기 때문에 3 명의 소비자가있을 수 있다고 생각했기 때문입니다.
b) 항목이 대기열에 있는지 확인하는 방법이 있습니까? 그렇다면 항목이 처리 될 때까지 차단할 항목이 있는지 확인하기 위해 발신자에게 확인을 요청 하시겠습니까?
편집 :
static BlockingCollection<string> coll = new BlockingCollection<string>();
static void Consume()
{
foreach (var i in coll.GetConsumingEnumerable())
{
Console.WriteLine(String.Format("Thread {0} Consuming: {1}", Thread.CurrentThread.ManagedThreadId, i));
Thread.Sleep(1000);
}
}
static void Main(string[] args)
{
int item = 0;
Task.Factory.StartNew(() =>
{
while (true)
{
coll.Add(string.Format("Item {0}", item++));
Thread.Sleep(500);
}
});
for (int i = 0; i < 2; i++)
{
Task.Factory.StartNew(() => Consume());
}
while (true) ;
}
항목은 다음과 같습니다 존 소총의 답변에 따라
여기 GetConsumingEnumerable()
을 사용하여 소비자와 하나의 프로듀서로 채워진 BlockingCollection에 작용하는 여러 소비자를 설명하기 위해 몇 가지 예제 코드입니다 두 개의 서로 다른 스레드에서 작동하는 두 소비자 사이에서 인터리브 방식으로 처리됩니다.
Thread 4 Consuming: Item 0
Thread 5 Consuming: Item 1
Thread 4 Consuming: Item 2
Thread 5 Consuming: Item 3
Thread 4 Consuming: Item 4
죄송합니다 - 두 번째 읽기에는 다소 모호합니다. 그래서, 문제는 내가 큐에 중복 항목을 추가하지 않도록 항목을 처리 대기열에 있는지 (간단히 말해서 linq 쿼리를 작성할 수 있음) 결정할 수 있기를 원합니다. (불필요한 작업을 방지합니다. 중복 처리). 이 대기열은 공유 위치에 PDF를 작성하는 명명 된 파이프를 통해 PDF 작성기에 대한 입력입니다. – pkiddie
이제 대기열에있는 항목 (예 : 작성한 HttpHandler)이 요청되면 해당 항목이 처리 될 때까지 HttpHandler에 대한 호출 요청을 차단하여 그 작업을 보장 할 수 있습니다. PDF 파일이 완성되기 전에 디스크에 PDF 파일이 있습니다. 문맥이 도움이 되길 바랍니다! – pkiddie
@pkiddie : 아이템이 이미 처리되었는지도 알고 싶지 않습니까? –