0

TimerCallback Delegateメカニズムを使用して、サードパーティの.NETライブラリコンポーネントからオブジェクトのインスタンスを、時間ベースで実行される個別のスレッドで駆動しようとしています。

ライブラリからオブジェクトのインスタンスを作成しようとすると、例外が発生します。

(オブジェクト名)はシングルスレッドアパートメント(STA)からのみ呼び出すことができます

私のアプリケーションのエントリポイントであるサブメインは、msdnのMicrosoftの例のようにMTAThreadとマークされています。

4

1 に答える 1

2

シングルスレッドのCOMコンポーネントには、STAスレッドで作成するという厳しい要件があります。これは、Main()メソッドの[STAThread]属性を使用し、メッセージループをポンピングすることによって作成します。Application.Run()によって作成されたものなど。

これで、ワーカースレッドまたはタイマーコールバックからそのようなコンポーネントを呼び出すことができます。COMは、コンポーネントのシングルスレッド要件が満たされていることを確認し、STAスレッドを呼び出すマーシャリングを行います。達成しようとしていたことを打ち負かすと、コンポーネントへのすべての呼び出しは1つのスレッドでのみ実行されます。あなたはそれを速くではなく遅くするでしょう。通話のマーシャリングは高速ではありません

ここには秘密のソースはありません。スレッド化をサポートしていないことを明示的に示したコンポーネントを、スレッド化されたコンポーネントに魔法のように変えることはできません。また、COMコンポーネントの大部分、さらに言えば.NETコンポーネントがスレッド化をサポートしていないことも珍しくありません。COMコンポーネントと.NETコンポーネントの違いは、COMがそれに対して何かを行うことです。.NETコンポーネントは通常、診断なしで、ある種のスレッドレースで誤動作します。

于 2010-07-29T10:39:27.703 に答える