0

我有一个线程 A(主 STA 线程),它创建一个 COM 对象并希望将它传递给另一个线程,所以我使用CoMarshalInterfaceAPI。

线程 B(MTA/STA 无关紧要)处理许多类型的事件,其中之一是接收流并调用CoUnmarshalInterface以获取代理对象。

因为调用CoUnmarshalInterface可能会失败(出于任何原因),如果发生这种情况,我必须调用CoReleaseMarshalData以释放流数据,但是,MSDN 文档说:

重要提示:您必须在调用将对象编组到流CoReleaseMarshalData中的同一个单元中调用该函数。CoMarshalInterface不这样做可能会导致流中的封送数据包持有的对象引用被泄露。

因此,在线程 A 中,我在调用后实现了等待CoMarshalInterface并检查是否CoUnmarshalInterface成功,但问题是在我等待时,如果线程 B 或另一个线程进行远程通信操作,因为线程 A 被阻塞等待结果,我陷入僵局。

我也试过使用CoWaitForMultipleHandles没有运气。

真的需要CoReleaseMarshalData在同一个公寓打电话吗?你知道另一种处理这个问题的方法吗?

4

1 回答 1

0

您遇到的问题似乎与编组本身无关。是的,您可以CoUnmarshalInterface从创建它的单元中释放编组流,但问题似乎是线程间同步,而不是编组本身:

因此,在线程 A 中,我在 CoMarshalInterface 调用之后实现了等待,并检查 CoUnmarshalInterface 是否成功,但问题是在我等待时,如果线程 B 或另一个线程进行远程通信操作,因为线程 A 被阻塞等待结果,我陷入僵局。

当您手头有流并将呼叫发送到另一间公寓时,重要的是您究竟在等待什么。由于您在 STA 中,您仍应在等待时在线程上调度窗口消息(例如使用MsgWaitForMultipleObjectsEx)。相反,您假设该块将是短期的,并且消息可以等待一段时间。然后,如果您有一个依赖于线程 A 上的消息调度的反向调用 - 这就是死锁的来源。

所以首先的问题是阻塞 STA 线程,包括阻塞消息分发。等待发送消息,或者将流放到一个安全的地方稍后发布,你不需要那么着急CoUnmarshalInterface,你可以稍后在你方便的时候释放资源。

于 2013-07-03T11:12:03.527 回答