1

COM+ アプリケーションに組み込まれる STA COM コンポーネントがあります。クライアントは、そのコンポーネントでクラスのインスタンスをいくつか作成し、それらのメソッドを並行して呼び出します。クラスは適切に登録されています。対応するクラス ID の「ThreadingModel」は「Apartment」です。

同じクラスの同じメソッドの複数の呼び出しが、コンポーネント内 (実際のコンポーネント コード) で並行して実行されていることがわかります。それらは同じプロセスで実行されますが、異なるスレッドで実行されます。

何が起こっていますか?COM+ はスレッド モデルを無視していますか? STA モデルでは、一度に 1 つの呼び出ししか実行できないのではないでしょうか?

4

4 に答える 4

2

STA は、オブジェクトが単一の特定のスレッドからのみアクセスされることを保証します。共有変数に対する保護は必要ありません。

VB6 には特別なモードがあったことを覚えています (どのように命名されたかは覚えていません)。COM+ が複数の STA を生成し、それぞれが専用オブジェクトを使用できるようにすることができました。ただし、これらのオブジェクトの変数はスレッド ローカル ストレージとして扱われます。そのため、COM クラスの複数のインスタンスが複数のスレッドからアクセスされますが、変数の共有は行われません。この機能を使用している可能性はありますか?

于 2009-05-14T08:10:45.413 に答える
1

いいえ、そうではありません。STA は文字通り「シングル スレッド アパートメント」を意味し、さらに、アパートメント内で実行できるスレッドは 1 つだけであることを意味します。今問題は、アパートとは何かということです。アパートメントはプロセス内の論理空間であり、その実装はフレームワークによって異なります。Microsoft は、(Microsoft の COM コンテキスト内の) STA がシングル スレッド スレッドに変換されるため、アパートメントをスレッドとして実装します。つまり、複数のアパートメント/スレッドが存在する可能性がありますが、STA の場合はすべてのアパートメント/スレッドがシングル スレッドになります。

このことを MTA に一般化できます。上で述べたことから、MTA は COM コンテキストのマルチスレッド スレッドです。

于 2009-05-14T06:48:46.640 に答える
1

別のアパートに住んでいるオブジェクトにオブジェクトを渡しましたか? もしそうなら、それを行う前にインターフェイスをマーシャリングする必要がありましたか? たまたまフリー スレッド マーシャラーを集約しましたか?

大まかに言えば、オブジェクトへのインターフェイスを別のアパートメント (スレッド) のオブジェクトに渡す場合は、必ずインターフェイスをマーシャリングする必要があります。そうしないと、呼び出しを正しく処理するプロキシを介して呼び出していないため、オブジェクトを他のアパートメントのオブジェクトから自由に呼び出すことができる場合があります。

オブジェクトへのすべての呼び出しは、そのスレッド (アパートメント内) で行う必要があります。オブジェクトを別のスレッドから直接呼び出すことは禁止されています。このフリースレッド方式でオブジェクトを使用すると、アプリケーションで問題が発生する可能性があります。この規則の意味するところは、オブジェクトへのすべてのポインターは、アパートメント間で受け渡されるときにマーシャリングする必要があるということです。COM は、この目的のために次の 2 つの関数を提供します。

* CoMarshalInterThreadInterfaceInStream marshals an interface into a stream object that is returned to the caller.
* CoGetInterfaceAndReleaseStream unmarshals an interface pointer from a stream object and releases it.

これらの関数は、MSHCTX_INPROC フラグを使用する必要がある CoMarshalInterface および CoUnmarshalInterface 関数への呼び出しをラップします。

于 2009-05-14T08:16:38.783 に答える