具有内在生命的 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);