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