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;
}
}
}
}
}