使用System.Threading.Tasks.Dataflow:链接块能否维持目标块存活?是否需保留引用?
Dataflow块链接与垃圾回收的关系
这是个使用TPL Dataflow时很容易困惑的问题,我来给你明确答案:
当你将块a链接到块b后,源块a会持有对目标块b的引用,所以只要a还存活,b就不会被垃圾回收,不需要额外保留对b的引用。
结合你的代码具体分析
在SomeDataflowUser的构造函数里,虽然b是局部变量,但调用_a.LinkTo(b)时,_a(作为源块)内部会维护一个对b的引用,用于把数据传递给b处理。因为类中通过私有字段_a持有了源块的引用,只要这个类的实例还存在,_a就不会被回收,连带b也会被引用链保护,不会被GC标记清理。
所以在ReactToIncomingMessage方法中调用_a.Post(data)时,完全不用担心b已经被回收的问题,它肯定能正常接收并处理从_a传递过来的数据。
补充说明
如果后续需要断开这个链接,可以调用LinkTo方法返回的IDisposable对象的Dispose方法:
var link = _a.LinkTo(b); // 后续不需要链接时执行 link.Dispose();
断开链接后,_a就不再持有b的引用了,这时候如果没有其他地方引用b,b就会被垃圾回收。
内容的提问来源于stack exchange,提问作者Haukinger
相关产品推荐
相关产品推荐

