COM オブジェクトを作成するスレッド A (メイン STA スレッド) があり、それを別のスレッドに渡したいので、CoMarshalInterface
API を使用します。
スレッド B (MTA/STA は関係ありません) は多くの種類のイベントを処理します。そのうちの 1 つはストリームを受信しCoUnmarshalInterface
、プロキシ オブジェクトを取得するために呼び出します。
への呼び出しCoUnmarshalInterface
は (何らかの理由で) 失敗する可能性があるため、それが発生した場合は、呼び出しCoReleaseMarshalData
てストリーム データを解放する必要がありますが、MSDN のドキュメントには次のように記載されています。
重要:オブジェクトをストリームにマーシャリングするために呼び出した
CoReleaseMarshalData
のと同じアパートメントで関数を呼び出す必要があります。CoMarshalInterface
これを行わないと、ストリーム内のマーシャリングされたパケットが保持するオブジェクト参照がリークする可能性があります。
したがって、スレッド A では、CoMarshalInterface
呼び出しの後に待機を実装し、CoUnmarshalInterface
成功したかどうかを確認しましたが、待機中にスレッド B または別のスレッドがリモート com 操作を行った場合、スレッド A が結果を待機してブロックされているため、問題が発生しました。 、デッドロックが発生します。
私も運悪く使っCoWaitForMultipleHandles
てみました。
本当にCoReleaseMarshalData
同じアパートに電話する必要がありますか? これを処理する別のアプローチを知っていますか?