「無料」ではなく「両方」のCOMスレッドモデルを使用するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1824397

質問

この記事または「無料」オブジェクトが完全にスレッドセーフでなければならないスレッドモデル。具体的には、グローバルシェア変数へのすべてのアクセスを同期する必要があり、メンバー変数へのすべてのアクセスも同期する必要があります。それは多大な努力です。

今では、「無料」を使用してオブジェクトを登録できることを理解しています。スレッドモデルは有利であり、完全にスレッドセーフにする代償を払う価値があるかもしれません。しかし、なぜ私はすべて同じことを行い、「両方」を使用してオブジェクトを登録したいのですか?代わりにスレッドモデルですか?利点は何でしょうか? 「両方」を選択するにはどうすればよいですか?および" Free"?

役に立ちましたか?

解決

両方のスレッドモデル

コンポーネントをサポートするスレッドモデル「両方」としてマークする主な理由これは、コンポーネントがシングルスレッドアパートメント(STA)から呼び出されるときのパフォーマンスの向上のためです。

コンポーネントをMTAとしてマークし、コンポーネントがSTA内から作成される場合、コンポーネントは別のMTAアパートメントと"結果として生じるアパートメント間のマーシャリングは、パフォーマンスを低下させ、効率的なフリースレッドコンポーネントを作成するためのすべての作業を無効にする可能性があります。ただし、コンポーネントのスレッドモデルが「両方」としてマークされている場合、 STAオブジェクトのアパートメント内に作成され、直接アクセスされます。

したがって、コンポーネントがSTA内から呼び出されると考えられる場合(すべてのVB6 COMオブジェクトはSTAです)、スレッドモデルを「両方」としてマークすることができます。

OLEスレッドモデルに関する優れたKB記事。

無料のスレッドモデル

「無料」を使用することもできます。コンポーネントが「無料」とマークされている他のコンポーネントを使用している場合は、スレッドモデル。コンポーネントが「両方」としてマークされている場合「Both」と「Both」の間にアパートが過度に切り替わる可能性があります。 STAおよびMTAで実行されているコンポーネント。一般的なルールとして、すべてのシナリオで適切に機能しながら、可能な限り呼び出し元に近いコンポーネント(つまり同じアパートメント)を作成するようにしてください。

コンポーネントを「無料」としてマークする必要がある別の状況明示的にブロックする場合(例:Thread.Sleep)。コンポーネントが「両方」としてマークされている場合STAでインスタンス化された場合、コンポーネントはSTAメッセージポンプをブロックします。

その他の考慮事項とシナリオ

IISでコンポーネントの使用を計画している場合は、他にも考慮すべきことがあります。 IISの場合、「両方」推奨設定です。主にアパートメントスレッドコンポーネントのロックの問題、COM + ObjectContextへのパフォーマンスアクセス、および「無料」という事実を回避するためスレッドコンポーネントはシステムセキュリティコンテキストを使用します(ユーザーのセキュリティコンテキストへのアクセスが必要な場合)。 IISの詳細については、 IISのコンポーネントのスレッドモデルの選択を参照してください。スレッドの考慮事項。

考慮すべきその他の事項は、COM +サポート、およびコンポーネントがCOM +で実行される場合のコンポーネントの動作、およびインターフェイスポインターが渡されて保存されるかどうかです。

優れた記事は COMスレッドアプリケーションとCOM +アプリケーションのアーキテクチャ。 COM +に焦点を当てていますが、COMについても説明しています。ご質問については、「スレッドモデルの推奨事項」というセクションをご覧ください。 Microsoftは元の記事を削除したため、コピーにリンクしています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top