2011-09-23 2 views
5

나는 파일 작성 이벤트를 모니터하고, 파일 내용에서 일부 오브젝트를 작성하며, 일부 처리를 수행하는 간단한 어플리케이션을 작성했습니다. 다음은 샘플 코드이다 : 그것은 모두 잘 작동PLINQ와 BlockingCollection의 공동 작업

class Program 
{ 
    private const string Folder = "C:\\Temp\\InputData"; 

    static void Main(string[] args) 
    { 
     var cts = new CancellationTokenSource(); 
     foreach (var obj in Input(cts.Token)) 
      Console.WriteLine(obj); 
    } 

    public static IEnumerable<object> Input(CancellationToken cancellationToken) 
    { 
     var fileList = new BlockingCollection<string>(); 

     var watcher = new FileSystemWatcher(Folder); 
     watcher.Created += (source, e) => 
     { 
      if (cancellationToken.IsCancellationRequested) 
       watcher.EnableRaisingEvents = false; 
      else if (Path.GetFileName(e.FullPath) == "STOP") 
      { 
       watcher.EnableRaisingEvents = false; 
       fileList.CompleteAdding(); 
       File.Delete(e.FullPath); 
      } 
      else 
       fileList.Add(e.FullPath); 
     }; 
     watcher.EnableRaisingEvents = true; 

     return from file in 
        fileList.GetConsumingEnumerable(cancellationToken) 
       //.AsParallel() 
       //.WithCancellation(cancellationToken) 
       //.WithDegreeOfParallelism(5) 
       let obj = CreateMyObject(file) 
       select obj; 
    } 

    private static object CreateMyObject(string file) 
    { 
     return file; 
    } 
} 

은,하지만 난 AsParallel (그리고 다음 두 줄)의 주석을 해제 할 때 즉시 결과를 얻을하지 않습니다. 이 지연은 PLINQ 파티셔닝에 의한 것입니까? 그러나이 쿼리는 BlockingCollection에 추가되는 즉시 항목을 생성 할 것으로 예상됩니다. PLINQ를 사용하여이를 달성 할 수 있습니까?

답변

2

그게 바로 .WithMergeOptions(ParallelMergeOptions.NotBuffered)입니다.

+0

이것은 완벽하게 작동했습니다. 많은 감사합니다! – yuramag