これまでに投稿されたコメントと回答にはかなりの混乱があります。 STAまたはMTAはスレッドのプロパティです。しかし重要なのは、COMコンポーネントが必要とするものです。これはThreadingModelレジストリ値で宣言されています。あなたは "アパート"、非常に一般的な設定を見つけました。これは、コンポーネントがスレッディングをサポートしていないことを意味します。
これは.NETフレームワークの大部分のクラスと異なり、スレッドセーフであるものはほとんどありません。大きな違いは、COM がスレッディングの安全性を強制していることです。 .NETクラスでは、クラスオブジェクトがスレッドセーフな方法で使用されるようにコードを記述する必要があります。それは正しい取得が難しく、バグを診断するのが非常に難しい慢性的な原因ですが、よく設計されたロックは、制限を回避することができます。これはCOMでは不可能ですが、スレッドセーフティは常に役立ちます。あなたが手伝っていても。
唯一の方法は、1つのスレッドからCOMコンポーネントを作成して使用することです。そのスレッドはSTAを選択するためにThread.SetApartmentState()で初期化する必要があります。これにより、コンポーネントの安全な避難場所を見つけるためにCOMが独自のスレッドを作成することを防ぎます。また、STAの要件であるメッセージループをポンプする必要があります。 COMコンポーネントを別のスレッドから使用しようとせず、コンポーネント自体がメッセージポンプを使用できるかどうかに依存しない場合は、痛いかもしれません。を避けてください。これはかなり一般的なbtwです。応答がなくなり、通常は期待どおりにイベントが発生しない場合は、イベントが発生しないことがわかります。同じスレッドからCOMオブジェクトを呼び出すだけで、独自のオブジェクトを作成する他のスレッドと並行性を得ることができます。これは通常、有用ではありません。
COMコンポーネントは、シングルスレッドアパートメント(STA)またはマルチスレッドアパートメント(MTA)として宣言されていますか? – Seb
どうやって確認できますか? – EagerToLearn
@EagerToLearn http://stackoverflow.com/questions/2722867/how-to-determine-threading-model-of-given-com-libraryを参照してください。 – shf301