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


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值