Microsoft TPL Dataflow 并行处理枚举,输出等

来源:互联网 发布:淘宝上买淘宝小号 编辑:程序博客网 时间:2024/05/22 00:18


TPL DataFlow是一个并行处理数据流的类。使用它可以做为目标输出流或写入流。

下面这个示例包括并行处理枚举,并行输出到控制台。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks.Dataflow;
using System.IO;


namespace ConsoleApplication1
{
    //NuGet 查找Microsoft TPL Dataflow安装.
    class Program
    {
        static void Main()
        {
            var target = setupPipeline();
            target.Post("../..");
            Console.ReadLine();
        }
        static ITargetBlock<string> setupPipeline()
        {
            var filenameforpath = new TransformBlock<string, IEnumerable<string>>(
                path =>
                {
                    return GetFileNames(path);
                });
            var line = new TransformBlock<IEnumerable<string>, IEnumerable<string>>(
                lines=>
                    {
                      return LoadLine(lines);
                    }
                );
            var word = new TransformBlock<IEnumerable<string>, IEnumerable<string>>(
                    w =>
                    {
                        return GetWords(w);
                    }
                );
            //Action是一个数据块,它接收数据,并把它写到控制台上。它是并行的。
            var display=new ActionBlock<IEnumerable<string>>(
                r=>
                    {
                        foreach (var item in r)
                        {
                            Console.WriteLine(item);
                        }
                    }
                );
            //启动语句块
            filenameforpath.LinkTo(line);
            line.LinkTo(word);
            word.LinkTo(display);
            return filenameforpath;
        }
        static IEnumerable<string> GetFileNames(string path)
        {
            foreach (var item in Directory.EnumerateFiles(path,"*.cs"))
            {
                yield return item;
            }
        }
        static IEnumerable<string> LoadLine(IEnumerable<string> file)
        {
            foreach (var item in file)
            {
                using(var stream = File.OpenRead(item))
           {
           var r = new StreamReader(stream);
                    string line=null;
                    while ((line=r.ReadLine())!=null)
                    {
                        yield return line;
                    } 
           }
            }
        }
        static IEnumerable<string> GetWords(IEnumerable<string> line)
        {
            foreach (var item in line)
            {
                var t = item.Split(' ', ',', ';');
                foreach (var word in t)
                {
                    yield return word;
                }
            }
        }
     }
}

0 0
原创粉丝点击