ARTICLE · 软件编程
为什么我们没有使用 COM 静态存储来清理无法封送的委托?
一语总结文章解释了为什么 COM 静态存储不适合清理无法封送的委托,因为它随最后一个线程关闭而关闭,而非按套间关闭,且其按套间版本仅限于 UWP 上下文使用。
Raymond Chen 回应了关于使用 COM 静态存储来管理无法封送委托生命周期的建议。他否决了这一方案,因为标准 COM 静态存储在最后一个线程关闭 COM 时终止,这与按套间清理的需求不符。虽然存在按套间的版本,但它绑定于 CoreApplicationView 且仅限于 UWP 单线程套间,无法用于通用场景。此外,实现自定义的按套间存储会在生成唯一名称和执行字典查找(O(log n) 或 O(1))方面产生开销,效率低于全局接口表的直接索引查找。
- 生命周期不匹配
全局 COM 静态存储仅在最后一个线程终止 COM 时关闭,无法满足由单个套间关闭触发的清理需求。
- UWP 限制
按套间的 COM 静态存储仅在 `CoreApplicationView` 内可用,将其使用范围限制在 UWP 应用程序和单线程套间中。
- 性能开销
使用基于通用字典的存储需要生成唯一标识符并执行查找,与全局接口表的直接索引相比,引入了更高的常数时间开销。
为什么我们没有使用 COM 静态存储来清理无法封送的委托?
Raymond Chen 回应了关于使用 COM 静态存储来管理无法封送委托生命周期的建议。他否决了这一方案,因为标准 COM 静态存储在最后一个线程关闭 COM 时终止,这与按套间清理的需求不符。虽然存在按套间的版本,但它绑定于 CoreApplicationView 且仅限于 UWP 单线程套间,无法用于通用场景。此外,实现自定义的按套间存储会在生成唯一名称和执行字典查找(O(log n) 或 O(1))方面产生开销,效率低于全局接口表的直接索引查找。
文章金句
"COM 静态存储帮不了我们,因为 COM 静态存储在最后一个线程关闭 COM 时运行结束,而我们想要的是在单个套间关闭 COM 时运行结束的东西。
"存在一个按套间的 COM 静态存储版本,但它是 CoreApplicationView 的一部分,这意味着(1)只有 UWP 程序才有,(2)仅存在于拥有核心应用程序视图的套间,而这些套间仅限于单线程套间。