ARTICLE · 软件编程

为什么我们没有使用 COM 静态存储来清理无法封送的委托?

作者:Raymond Chen 来源:The Old New Thing 2026-10-24 02:39 1 分钟 4 阅读 196 字
编程与工程Windows 与微软生态系统设计性能优化建筑与室内设计
一语总结

文章解释了为什么 COM 静态存储不适合清理无法封送的委托,因为它随最后一个线程关闭而关闭,而非按套间关闭,且其按套间版本仅限于 UWP 上下文使用。

AI 总结

Raymond Chen 回应了关于使用 COM 静态存储来管理无法封送委托生命周期的建议。他否决了这一方案,因为标准 COM 静态存储在最后一个线程关闭 COM 时终止,这与按套间清理的需求不符。虽然存在按套间的版本,但它绑定于 CoreApplicationView 且仅限于 UWP 单线程套间,无法用于通用场景。此外,实现自定义的按套间存储会在生成唯一名称和执行字典查找(O(log n) 或 O(1))方面产生开销,效率低于全局接口表的直接索引查找。

核心要点
  1. 生命周期不匹配

    全局 COM 静态存储仅在最后一个线程终止 COM 时关闭,无法满足由单个套间关闭触发的清理需求。

  2. UWP 限制

    按套间的 COM 静态存储仅在 `CoreApplicationView` 内可用,将其使用范围限制在 UWP 应用程序和单线程套间中。

  3. 性能开销

    使用基于通用字典的存储需要生成唯一标识符并执行查找,与全局接口表的直接索引相比,引入了更高的常数时间开销。

为什么我们没有使用 COM 静态存储来清理无法封送的委托?

Raymond Chen 回应了关于使用 COM 静态存储来管理无法封送委托生命周期的建议。他否决了这一方案,因为标准 COM 静态存储在最后一个线程关闭 COM 时终止,这与按套间清理的需求不符。虽然存在按套间的版本,但它绑定于 CoreApplicationView 且仅限于 UWP 单线程套间,无法用于通用场景。此外,实现自定义的按套间存储会在生成唯一名称和执行字典查找(O(log n) 或 O(1))方面产生开销,效率低于全局接口表的直接索引查找。

文章金句

"

COM 静态存储帮不了我们,因为 COM 静态存储在最后一个线程关闭 COM 时运行结束,而我们想要的是在单个套间关闭 COM 时运行结束的东西。

"

存在一个按套间的 COM 静态存储版本,但它是 CoreApplicationView 的一部分,这意味着(1)只有 UWP 程序才有,(2)仅存在于拥有核心应用程序视图的套间,而这些套间仅限于单线程套间。