2011-09-23 5 views
13

.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 

답변

10

여러 소비자는 동시에 Take 또는 TryTake를 호출 할 수 있습니다 - 각 항목은 단일 소비자가 소비됩니다.

그러나 나는 GetConsumingEnumerable도 원하는 것을 수행 할 것이라고 믿습니다. 나는 각 호출자가 호출 할 때, 각각은 별도의 소비 열거 형을 얻게 될 것이라고 생각한다. 다시 말해서 각 항목은 한 번만 소비된다는 것을 확인할 것이다. 나는 대기열이 비게 될 때 어떤 일이 발생하는지 확실히 알지 못합니다. MoveNext()이 블록을 반환하는지 또는 false를 반환하는지 모르겠습니다.

나는 두 번째 질문을 실제로 따르지 않았다 ...

+0

죄송합니다 - 두 번째 읽기에는 다소 모호합니다. 그래서, 문제는 내가 큐에 중복 항목을 추가하지 않도록 항목을 처리 대기열에 있는지 (간단히 말해서 linq 쿼리를 작성할 수 있음) 결정할 수 있기를 원합니다. (불필요한 작업을 방지합니다. 중복 처리). 이 대기열은 공유 위치에 PDF를 작성하는 명명 된 파이프를 통해 PDF 작성기에 대한 입력입니다. – pkiddie

+0

이제 대기열에있는 항목 (예 : 작성한 HttpHandler)이 요청되면 해당 항목이 처리 될 때까지 HttpHandler에 대한 호출 요청을 차단하여 그 작업을 보장 할 수 있습니다. PDF 파일이 완성되기 전에 디스크에 PDF 파일이 있습니다. 문맥이 도움이 되길 바랍니다! – pkiddie

+0

@pkiddie : 아이템이 이미 처리되었는지도 알고 싶지 않습니까? –

관련 문제