我有一个线程A(主STA线程),它创建一个COM对象并希望将其传递给另一个线程,因此我使用CoMarshalInterface
API。
线程B(MTA / STA无关紧要)处理许多类型的事件,其中一个事件是接收流并调用CoUnmarshalInterface
来获取代理对象。
由于对CoUnmarshalInterface
的调用可能会失败(出于任何原因),如果发生,我必须调用CoReleaseMarshalData
来释放流数据,但MSDN文档说:
重要提示:您必须同时调用
CoReleaseMarshalData
功能 叫CoMarshalInterface
的公寓将对象编组进去 流。不这样做可能会导致对象引用 流中的封送数据包将被泄露。
所以,在线程A中,我在CoMarshalInterface
调用之后实现了等待,并检查CoUnmarshalInterface
是否成功但问题是在我等待时,如果线程B或另一个做了远程-com操作,因为线程A被阻塞等待结果,我得到了死锁。
我也试过使用CoWaitForMultipleHandles
而没有运气。
真的需要在同一间公寓打电话给CoReleaseMarshalData
吗?你知道另一种处理方法吗?
答案 0 :(得分:0)
你遇到的问题似乎与编组本身无关。是的,您执行CoUnmarshalInterface
以从您创建它的公寓中释放编组流,但问题似乎是线程同步,而不是编组本身:
所以,在线程A中,我在CoMarshalInterface调用之后实现了一个等待,并检查CoUnmarshalInterface是否成功但问题是当我等待时,如果线程B或另一个进行了远程com操作,因为线程A是阻止等待结果,我陷入僵局。
当您手上有流并将呼叫发送到另一间公寓时,重要的是您的等待时间。由于您在STA中,您仍应在等待时在线程上调度窗口消息(例如,使用MsgWaitForMultipleObjectsEx
)。相反,你假设该块将是短期的,并且消息可以等待一段时间。然后,如果你有一个依赖于线程A上的消息调度的反向调用 - 这就是死锁的来源。
所以问题首先是阻塞STA线程,包括阻塞消息调度。等待发送消息,或者将流放到安全的地方以便以后发布,您不需要快点CoUnmarshalInterface
,并且您可以在第一次方便时释放资源。