5

ファイル作成イベントを監視し、ファイルコンテンツからいくつかのオブジェクトを作成し、いくつかの処理を行う簡単なアプリケーションをまとめました。サンプルコードは次のとおりです。

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(および次の2行)のコメントを外しても、すぐには結果が得られません。この遅延はおそらくPLINQのパーティショニングが原因ですか?ただし、BlockingCollectionに追加されるとすぐに、このクエリでアイテムが生成されることを期待しています。これはPLINQを使用して達成できますか?

4

1 に答える 1

2

それが.WithMergeOptions(ParallelMergeOptions.NotBuffered)設計されるべきものです。

于 2011-09-23T19:49:33.043 に答える