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