2012-04-09 1 views
1

기본적으로 처리 할 객체의 정적 사용자 정의 대기열이 있습니다. 여러 스레드에서 대기중인 개체를 처리하는 단일 작업을 시작해야하며 모든 항목이 대기열에서 제외 될 때 작업이 중지됩니다.하나의 작업 만 비동기 적으로 시작하여 정적 대기열을 처리하고 완료되면 중지합니다.

일부 사이비 코드 : 내 사용자 정의 큐들은 특정 연령에 도달 할 때까지 기본적으로 아이템을 보유하고 큐 인 차이를 만드는 경우

static CustomQueue _customqueue; 
static Task _processQueuedItems; 

public static void EnqueueSomething(object something) { 
    _customqueue.Enqueue(something); 
    StartProcessingQueue(); 
} 

static void StartProcessingQueue() { 
    if(_processQueuedItems != null) { 
     _processQueuedItems = new Task(() => { 
     while(_customqueue.Any()) { 
      var stuffToDequeue = _customqueue.Dequeue(); 
      /* do stuff */ 
     } 
     }); 
    _processQueuedItems.Start(); 
    } 
    if(_processQueuedItems.Status != TaskStatus.Running) { 
     _processQueuedItems.Start(); 
    } 
} 

후 그들 큐에서 할 수 있습니다. 항목을 터치 할 때마다 타이머가 다시 시작됩니다. 나는이 작품이 잘 작동하는 것을 안다.

내가 고민하고있는 부분은 병렬 처리입니다. (분명히, 내가 여기서 뭘하는지 모르겠다.) 내가 원했던 것은 하나의 스레드가 완료 될 때까지 대기열을 처리 한 다음 사라지도록하는 것입니다. 다른 호출이 들어오지 않으면 새로운 스레드가 시작되지 않습니다.

나는 내 문제를 설명하기를 바랍니다.

답변

2

여기서 BlockingCollection<T>을 사용하는 것이 좋습니다. 사용자 정의 대기열을 IProducerConsumerCollection으로 구현할 수 있습니다.이 경우 BC가 직접 사용할 수 있습니다.

그런 다음 blockingCollection.GetConsumingEnumerable()을 호출하고 foreach로 항목을 처리하기 위해 장기 실행 작업을 시작하면됩니다. 작업이 컬렉션이 비어지면 자동으로 차단되고 새 항목이 Enqueued 일 때 다시 시작됩니다.

+0

감사합니다. 나는 그것이 존재한다는 것을 몰랐다. 호기심에서 그걸 어떻게 알았 니? 아마도 "X.0의 새로운 점"에 대한 기사 만 읽으면됩니다. –

+1

@blesh System.Collections.Concurrent에는 조사 할 가치가있는 몇 가지 유용한 정보가 있습니다.이 내용은 http://msdn.microsoft.com/en-us/library/dd460718.aspx에 문서화되어 있습니다. 향후 내용은 http : /blogs.msdn.com/b/pfxteam/archive/2011/09/17/10212961.aspx –

관련 문제