具有内在生命的 TPL 数据流块
TPL Dataflow block with an inner life
我一直在进行一些 TPL 数据流编码,对基础知识非常满意。我的问题是,我将如何做一个 TPL 块,除了对其队列做出反应外,它还有自己的生命?
比如,一个永久循环运行的后台任务,每隔几秒轮询一次奇怪的网络服务或数据库,并在它认为合适时在其输出上发出消息?
接口将是源块和目标块,但源消息和目标消息之间没有明显的联系。
基本上是一个“活动”块。
块不是后台任务或工作人员。他们在管道和消息之外没有自己的生命周期。但这并不意味着您不能按照您的要求去做。不过,您必须以某种方式从外部触发头部块。
做你想做的事情的一种方法是创建一个定时器来“ping”管道的头部块:
var head=new TransformBlock<int,...>(...);
...
var timer=new System.Threading.Timer(_=>head.PostAsync(0),null,0,5000);
您可以根据需要启动、停止或更改计时器。
您可以使用这个例子定期处理文件夹中的文件:
var crawler=new TransformManyBlock<string,string>(root=>{
return Directory.EnumerateFiles(root,"*.csv");
});
var parseCsv=new TransformBlock<string,Record[]>(filePath=>{
var records=await parseCsvAsync(filePath);
return records;
}
...
var timer=new System.Threading.Timer(_=>head.PostAsync(rootFolder),null,0,5000);
我一直在进行一些 TPL 数据流编码,对基础知识非常满意。我的问题是,我将如何做一个 TPL 块,除了对其队列做出反应外,它还有自己的生命?
比如,一个永久循环运行的后台任务,每隔几秒轮询一次奇怪的网络服务或数据库,并在它认为合适时在其输出上发出消息?
接口将是源块和目标块,但源消息和目标消息之间没有明显的联系。
基本上是一个“活动”块。
块不是后台任务或工作人员。他们在管道和消息之外没有自己的生命周期。但这并不意味着您不能按照您的要求去做。不过,您必须以某种方式从外部触发头部块。
做你想做的事情的一种方法是创建一个定时器来“ping”管道的头部块:
var head=new TransformBlock<int,...>(...);
...
var timer=new System.Threading.Timer(_=>head.PostAsync(0),null,0,5000);
您可以根据需要启动、停止或更改计时器。
您可以使用这个例子定期处理文件夹中的文件:
var crawler=new TransformManyBlock<string,string>(root=>{
return Directory.EnumerateFiles(root,"*.csv");
});
var parseCsv=new TransformBlock<string,Record[]>(filePath=>{
var records=await parseCsvAsync(filePath);
return records;
}
...
var timer=new System.Threading.Timer(_=>head.PostAsync(rootFolder),null,0,5000);