我有一个如下设置的流程:
_publisherQueue = CreateBuffer();
var batchingBlock = CreateBatchBlock(options.BatchSize);
var debounceBlock = CreateDebounceBlock(options.DebounceInterval, batchingBlock.TriggerBatch);
var publishBlock = CreatePublishBlock();
var groupByTopicBlock = CreateGroupByTopicBlock(publishBlock);
_publisherQueue.LinkTo(debounceBlock, new DataflowLinkOptions { PropagateCompletion = true});
debounceBlock.LinkTo(batchingBlock, new DataflowLinkOptions { PropagateCompletion = true });
batchingBlock.LinkTo(groupByTopicBlock, new DataflowLinkOptions { PropagateCompletion = true });
其中:
CreateDebounceBlock
返回一个转换块(带有计时器来触发batchblock
)CreateGroupByTopicBlock
返回一个ActionBlock
,其Action
触发由CreatePublishBlock
返回的Action block
我不能处理这些链接,因为该流应在程序的整个生命周期内存在(在此示例中为Windows服务)。
我注意到每次调用_publisherQueue
(它是一个BufferBlock
)都会使用一些内存,这是正常的。但是,在进程完成后,分配的内存没有被释放。
这令人担忧,因为这是一个长时间运行的过程,将在随机时间间隔接受输入。
这是我第一次尝试使用TPL,所以很可能我没有正确处理。但是,我不确定需要处置什么,因为我需要这些结构在整个程序的生命周期内保持活动状态。
Complete()
,那么就没有释放任何东西的理由。您可以在下一纳秒内发布另一条消息。流程应该处理大量的消息,特别是在服务中使用时。 - Panagiotis Kanavos