您的位置:首页 > 编程语言 > PHP开发

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

2015-06-04 21:30 621 查看
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;

                }

            }

        }

     }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: