2011-09-23 11 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 (और अगले दो लाइनों) uncomment यह परिणाम नहीं करता है अभी। यह विलंब शायद PLINQ विभाजन के कारण होता है? हालांकि, मैं उम्मीद करता हूं कि इस क्वेरी को ब्लॉकिंग कोलेक्शन में जोड़े जाने के तुरंत बाद आइटम मिलेंगे। क्या PLINQ का उपयोग करना संभव है?

उत्तर

2

यही है .WithMergeOptions(ParallelMergeOptions.NotBuffered) के लिए डिज़ाइन किया जाना चाहिए।

+0

यह पूरी तरह से अच्छी तरह से काम किया। बहुत धन्यवाद! – yuramag

संबंधित मुद्दे