TPL数据流资源尚未发布

时间:2016-12-12 19:09:29

标签: c# asynchronous parallel-processing task-parallel-library tpl-dataflow

我有以下方式设置流程:

_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服务)。

我注意到每次调用_publisherQueueBufferBlock时)都会使用一些内存,这是正常的,但是在完成该过程后,分配的内存不会被释放。

这是令人担忧的,因为这是一个长时间运行的过程,它将以随机间隔接受输入。

这是我第一次尝试使用TPL,所以很可能我没有做好处理。但是我不确定我需要处理什么,因为我需要这些结构在程序的整个生命周期中保持活着。

1 个答案:

答案 0 :(得分:0)

我担心这一部分:

  

CreateGroupByTopicBlock返回ActionBlock,其Action触发Action

返回的CreatePublishBlock

这里看起来像一个闭包,很容易导致内存泄漏,因为它被编译成一个内部类,并将其中的所有引用存储在字段中。您应该使用一些内存分析器(内置VS分析器或某些外部代码,如dotTrace)调查您的应用程序,并查看此闭包内是否有任何对象被引用保留,并且可能会重写您的逻辑以避免不必要的闭包你的代码。