【发布时间】:2018-03-22 18:16:14
【问题描述】:
当使用System.Threading.Tasks.Dataflow时,如果我将块a链接到块b,链接会保持b处于活动状态吗?还是我需要保留对b 的引用以防止它被收集?
internal class SomeDataflowUser
{
public SomeDataflowUser()
{
_a = new SomeBlock();
var b = new SomeOtherBlock();
_a.LinkTo(b);
}
public void ReactToIncomingMessage( Something data )
{
// might b be collected here?
_a.Post( data );
}
private ISourceBlock<Something> _a;
}
【问题讨论】:
-
有什么东西让
a活着吗?a和b在这里似乎是未初始化的局部变量;这些是什么?您是否有某些理由不相信垃圾收集器能够正确完成其工作?你到底想问什么? -
@Eric:我的问题是关于数据流的内部工作原理:链接会阻止垃圾收集吗?
-
@Lasse: "link a to b" 表示在
a上调用LinkTo参数b -
那些是托管对象。垃圾收集器的唯一工作是正确管理它们的生命周期。相信 GC。
-
@Eric:我信任 GC,但我不知道
LinkTo是否建立了 GC 识别的链接,或者它是否创建了弱引用。这并非完全不可能,想想PropertyObserver或 Prism 的EventAggregator两者都不能让订阅者保持活力。 Dataflow 可能会认为只有我明确引用的块才被认为是活动的。
标签: c# tpl-dataflow