2012-09-02 1 views
2

스레드가 있는데이를 "구문 분석 스레드"라고합니다.다중 스레드 세션 후에 스레드가 재개되지 않습니다.

Thread parsingThread = new Thread(myMethod); 

이 스레드에 대한 계산을 수행합니다.이 스레드는 마지막 병렬 처리가 더 많이 포함됩니다.

public void ReadCityFiles(BlockingCollection<GeonamesFileInfo> files) 
    { 
     Parallel.ForEach<GeonamesFileInfo>(
      files.GetConsumingPartitioner<GeonamesFileInfo>(), 
      new ParallelOptions { MaxDegreeOfParallelism = _maxParallelism }, 
      (inputFile, args) => 
      { 
       RaiseFileParsing(inputFile); 
       using (var input = new System.IO.StreamReader(inputFile.FullName)) 
       { 
        while (!input.EndOfStream) 
        { 
         RaiseEntryParsed(ParseCity(input.ReadLine())); 
         Interlocked.Increment(ref _parsedEntries); 
        } 
       } 
       RaiseFileParsed(inputFile); 
      }); 
     RaiseDirectoryParsed(Directory); 
    } 

문제는이 매우 길고 계산 비용 비동기 foreach는 작업 (~ 30 분) 완료되면, "구문 분석 스레드는"다시 시작하지 않습니다. 내 GUI는 여전히 반응하지만 "Parsing Thread"에서 계속 실행해야하는 RaiseDirectoryParsed 함수는 호출되지 않습니다. 지금까지이 프로그램을 디버깅했으며,이 상황에서해야 할 일에 대해 꽤 당황 스러웠습니다.

+0

RaiseDirectoryParsed의 기능 및 "구문 분석 스레드"의 기능은 무엇입니까? – usr

+0

'Parellel.ForEach' 작업 중 대부분이 제대로 종료되지 않습니다. 이것을 결정하기 위해 콘솔 메시지를 사용 했습니까? – Tudor

+0

구문 분석 스레드가 처리하는 이벤트를 발생시킵니다. 어쨌든 실행되지 않습니다. parsing thread가 절대로 다시 시작하지 않는 것처럼 parallel.foreach 다음에 실행이 중지됩니다. –

답변

2

요점은 BlockingCollection입니다. 현재 작업을 수행 할 수 없지만 이후에 작업을 수행 할 수있는 경우 (예 : 제한된 용량의 컬렉션에서 Take() 또는 Add()) 차단됩니다. GetConsumingEnumerable()과 마찬가지로 GetConsumingPartitioner()에도 적용됩니다. 컬렉션이 현재 비어있는 경우 컬렉션에 항목을 추가 할 때까지 열거 가능 항목이 차단됩니다.

하지만 컬렉션에 새로운 항목을 더 이상 추가하지 않아도되고 나중에 비워 둘 때 차단해서는 안된다는 메시지가 표시됩니다. the CompleteAdding() method. 더 이상 새 항목을 콜렉션에 추가하지 않을 때 이것을 호출하면 Parallel.ForEach()이 더 이상 차단되지 않고 스레드가 계속 실행됩니다.

+0

관찰 해 주셔서 감사합니다. 그러나 CompleteAdding()을 호출했으며 컬렉션의 isComplete 필드가 true인지 확인했습니다. 무엇이 문제 일 수 있습니까? –