我有以下方式设置流程:
_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
我无法处理链接,因为此流程应该在程序的整个生命周期内存在(在这种情况下,它是Windows服务)。
我注意到每次调用_publisherQueue
(BufferBlock
时)都会使用一些内存,这是正常的,但是在完成该过程后,分配的内存不会被释放。
这是令人担忧的,因为这是一个长时间运行的过程,它将以随机间隔接受输入。
这是我第一次尝试使用TPL,所以很可能我没有做好处理。但是我不确定我需要处理什么,因为我需要这些结构在程序的整个生命周期中保持活着。
答案 0 :(得分:0)
我担心这一部分:
返回的
CreateGroupByTopicBlock
返回ActionBlock
,其Action
触发Action
CreatePublishBlock
块
这里看起来像一个闭包,很容易导致内存泄漏,因为它被编译成一个内部类,并将其中的所有引用存储在字段中。您应该使用一些内存分析器(内置VS分析器或某些外部代码,如dotTrace)调查您的应用程序,并查看此闭包内是否有任何对象被引用保留,并且可能会重写您的逻辑以避免不必要的闭包你的代码。