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;
}
}
}
}
}
下面这个示例包括并行处理枚举,并行输出到控制台。
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;
}
}
}
}
}
相关文章推荐
- thinkPHP 无刷新分页
- H.264/ACC音视频编码流的RTP/RTSP传输实现(1)
- Yii2 使用 bootboxJS美化confirm窗口
- PHP设计模式——命令模式
- 命令行方式运行yii2程序
- php面向对象(OOP)—__call()处理调用错误
- php面向对象(OOP)—__toString()和__clone()
- 修改.htaccess实现301重定向的几种例子
- php关于变量(二)
- php面向对象(OOP)—static和const
- phpmyadmin error Notice: Array to string conversion in libraries\Error.class.php
- PHP类的继承和接口
- Php5.5新特性 Generators详解
- PHP 变量类型中的一些问题
- PHP+Aax实现异步验证
- laravel 5中 新建的event对应的handler不能响应的问题 解决方法
- ftp服务相关配置域管理
- yii2总结
- 开源一个工作计划管理小项目
- 【转】ubuntu12.04上安装imagemagick的PHP扩展