我们有一个使用 COM dll 的 .NET 应用程序,该组件的 ThreadingModel 是“Appartment”
应用程序总是挂起调用 COM 接口方法。
DebugDiag 分析说明如下
终结器线程可能正在尝试释放 STA COM 组件的实例,并且它被卡住等待 STA 线程变得可用。若要解决此问题,请调用 Marshal.ReleaseComObject 以确定性地(立即)清理您在代码中使用的所有单元线程 COM 组件的引用,而不是等待终结器线程稍后执行此操作。
在推荐部分,它建议将线程模型更改为“两者”,我这样做并且工作正常,但这无法完成,因为我们有一个 UI,并且根据我们的设计不建议这样做。
知道我们的 .NET 应用程序代码中的哪些更改可以解决此问题。
堆栈跟踪 有两个线程 2 和 65 试图调用线程 45 上的 COM 对象,我猜是线程 2 的 STA 线程调用堆栈
线程 65 的调用栈