问题描述
dispose()
方法中的阻塞(同步变体)无论如何会影响 GC 过程吗?
假设:
- 到目前为止,我将
dispose
理解为一种“正常”方法,它也可能被编译器从某些语法糖结构(如using (var i = new Something(...)){}
或 {{1})生成的代码中“意外”调用如果using var i = new Something(...)
不适合我们(出于任何原因),我们就直接调用它; - 这意味着,内部的任何阻塞操作都意味着只会在
using
执行点延迟,对吗? - 这意味着,GC 根本不关心
dispose
并且只收集任何实例,当没有对它的引用时,无论dispose
是否被调用,对吧? - 从上面我暗示,在上述条件下,在处理 dispose 中阻塞的实例时,没有任何内存泄漏或 GC 影响的原因,对吗?
此类示例:
dispose
解决方法
正确。
如果它没有终结器,GC 就不会关心 Dispose
方法。
这听起来像是一个很大的代码味道:如果 Dispose
是必要的,我想确保在大多数情况下调用它是可取的,因此您需要一个终结器。终结器在任何情况下不得阻塞或抛出异常。
Dispose
阻止两者也是出乎意料的。所以你真的应该避免这种设置。