我有一個線程A(主STA線程),它創建一個COM對象,並且想將它傳遞給另一個線程,所以我使用了CoMarshalInterface
API。CoReleaseMarshalData usage
線程B(MTA/STA無關緊要)處理許多類型的事件,其中一個事件接收數據流並調用CoUnmarshalInterface
來獲取代理對象。
因爲調用CoUnmarshalInterface
可能失敗(因爲任何原因),如果真的發生了,我必須調用CoReleaseMarshalData
釋放流數據,但是,MSDN文檔說:
重要:你必須調用
CoReleaseMarshalData
功能在同一個 公寓,稱CoMarshalInterface
將對象編組爲 這個流。如果不這樣做,可能會導致流中封送的數據包被泄漏,導致 所持有的對象引用被泄漏。
所以,在線程A,我實現了一個等待的CoMarshalInterface
調用後,檢查是否CoUnmarshalInterface
成功與否,但問題是,雖然我等待,如果線程B或另一個人讓遠程-COM操作,因爲線程A被阻塞等待結果,我得到一個死鎖。
我也嘗試使用CoWaitForMultipleHandles
沒有運氣。
真的需要在同一間公寓撥打CoReleaseMarshalData
嗎?你知道處理這個問題的另一種方法嗎?
嗨@Roman,我用'CoWaitForMultipleHandles'做了等待,但結果是一樣的。我可以刪除等待,讓程序繼續執行。線程B將接收流並調用'CoUnmarshalInterface',但是如果解組失敗,我可以安全地調用線程B中的'CoReleaseMarshalData',還是應該使用QueueUserAPC定位線程A釋放編組數據?基本上我遇到的問題是發佈數據,而不是解組數據。 –
當然,你可以擁有一個標誌(或者流的存在本身就是這樣一個指標),一旦'CoUnmarshalInterface'成功,你不再需要在線程A上調用'CoReleaseMarshalData'。 –
是的,但是我的問題是在哪裏調用' CoReleaseMarshalData'如果解組失敗。在線程A中排隊用戶apc或者我可以在線程B中調用它。 –