アンマネージ MTA COM オブジェクトに関連するバグに取り組んでいます。オブジェクトには Lock メソッドと Unlock メソッドがあり、Unlock を呼び出すために Lock を呼び出したのと同じスレッドを必要とするミューテックスを使用します。
問題は、Lock と Unlock がマネージ STA スレッドから (COM 相互運用機能を使用して) 呼び出される場合、呼び出しは RPC コールバック スレッドの COM オブジェクトに入りますが、使用されるコールバック スレッドは両方の呼び出しで常に同じであるとは限りません。同じでない場合、ミューテックスのロックを解除できないため、Unlock 呼び出しは失敗します。
言い換えると:
マネージド STA スレッド 1 -> RPC コールバック (スレッド 11) -> ロック
マネージド STA スレッド 1 -> RPC コールバック (スレッド 12) -> ロック解除 -> エラー
修正について決定を下す前に、考えられるすべての解決策を評価しようとしています。そのため、私は見つけようとしています:
1) そもそも RPC コールバック スレッドが使用されないようにする方法はありますか? 私のテストでは、管理されていない STA スレッドからオブジェクトへの呼び出しを行うと、呼び出しは呼び出し元のスレッド自体に着信するように見えます。RPC コールバック スレッドの使用を必要とする .Net からの呼び出しとの違いは何ですか? RPC コールバックが使用されないようにする方法はありますか? (MTA 呼び出しスレッドを使用する場合を除く)
2) そうでない場合、同じマネージド STA スレッドから一貫した RPC コールバック スレッドを強制的に使用する方法はありますか?