1

次の質問に対する明確な答えを見つけることができませんでした: COM クラスがスレッド セーフである場合、つまり、Both または Free でマークされている場合、そのオブジェクト インターフェイスをマーシャリングして、同じプロセス内の別のスレッドに渡す必要がありますか? 両方のスレッドが MTA に属している場合については質問しません。各スレッドが独自の STA に属している場合について質問します。

異なるアパートメントに属するスレッド間のインターフェイスをマーシャリングするルールについて知っています。私の質問は、生のインターフェイス ポインターを別のアパートメントのスレッドに渡し、各スレッドがスレッド セーフなオブジェクトのメソッドを呼び出すとどうなるかということです。

私の経験によると、それは問題なく動作します。私の質問は、それが時間の問題であり、危険であり、何らかの理由でクラッシュにつながる可能性があるか、それとも完全に安全であり、ルールがあるのが良いかということです?

4

1 に答える 1

2

TL;DR - 常にマーシャリング... 常に。

なんで?COMはそれを認識し、正しいことをします...

... 同じプロセス内の別のスレッドに渡すために、そのオブジェクト インターフェイスをマーシャリングする必要はありますか?

はい。いつも。

ここでの COM のルールは、COM オブジェクトへのアクセスは、それが作成されたのと同じアパートメント (STA の場合は同じスレッドで読み取られる) で常に行わなければならないということです。別々のアパートメントにあるオブジェクトが互いに待機するため、COM 呼び出し間のデッドロックが発生します。

マーシャルのソース アパートメントとターゲット アパートメントが MTA であることを COM が認識した場合、COM はオーバーヘッドを課しません。また、必要に応じて他のアパートメントへのコールバックを管理することもできます。

... COM クラスがスレッド セーフである場合、つまり、Both または Free とマークされています...

これが意味することは、オブジェクトがどちらのアパートメント タイプでも使用できるということです。それが住むアパートが決まるのは作成の時点です。

私の経験によると、問題なく動作します。私の質問は、それが時間の問題であり、危険であり、何らかの理由でクラッシュにつながるのか、それとも完全に安全であり、ルールがあるのがいいのかということです?

COM スレッド モデルを覆すことは、通常、涙を流して終わります。カチカチ時限爆弾です。やらないでください。


コメントに記載されているように、ありますがCoCreateFreeThreadedMarshaler、リンクされたドキュメントのコメントに記載されているように、「... COM のルールの計算された違反...」が必要であり、非一般的または狭い帯域を示唆しています適用性の。

于 2016-07-19T09:20:14.930 に答える