2013-07-12 3 views
0

동시 수집의 개체를 여러 작업에서 사용하려고하지만 특정 리소스를 사용할 수있는 경우에만 작업을 수행하려고합니다. 이 자원의 가용성을 신호의 이유로 작업 스케줄링 및 WaitHandles

가, 내가으로 ManualResetEvent를 사용하고, 내 작업 기관은 다음과 같습니다 : 그러나

 while(!_token.IsCancellationRequested) 
     { 
      operationsLock.WaitLock(); 
      _token.ThrowIfCancellationRequested(); 
      // dothings 
     } 

, 나는 순간부터 잠금 잠금이 해제 것으로 나타났습니다 작업을 다시 스케줄하는 순간까지는 작업이 다시 시작될 수있는 수백 밀리 초가있을 수 있습니다. 실제로는 일정이 잡혀 있지 않기 때문에 발생하지 않을 수 있습니다.

TaskFactory를 사용하여 Tasks를 시작할 때이 동작을 어떻게 향상시킬 수 있습니까? 리소스를 사용할 수없는 동안 작업을 일시 중지하는 더 나은 전략이 있습니까?

답변

1

이 경우 WaitHandle을 사용하기에는 너무 비쌉니다. 대기 작업이 메모리 리소스를 소비하기 때문입니다. 단일 작업으로 컬렉션에서 사용 가능한 모든 개체를 소비해야하며 사용할 수있는 항목이없는 경우 작업을 완료해야합니다.

void ConsumingTaskBody() 
{ 
    bool available; 
    do 
    { 
     available = _collection.TryGetNext(out item); 
     Process(item); 
    }while(available); 
} 

새 항목이 컬렉션에 추가 된 경우 작업이 이미 실행 중인지 확인하고, 그렇지 않은 경우 확인한 다음 새로 시작하십시오.

void OnNewItemAdded() 
{ 
    if(_taskRunning) 
     return; 
    StartNewConsumingTask(); 
} 

당신은 새 작업을 만드는 자원을 소비하지 않고, ThreadPool를 사용할 수 있습니다.