1

ここの別のスレッドで問題が発見されました。STA である COM コンポーネントにアクセスする必要があります。デュアルコア コンピューターで実行します。このコンポーネントを使用するプロセスは、CPU の 50% にしか達しません。残念ながら、所有者はコンポーネントを MTA に変更できないと述べています。これは、コンポーネントが C をコアとする Matlab でコンパイルされたハイブリッド システムであるためです。

そのため、COM クラスの 2 つのインスタンスを同じプロセスにロードしようとしましたが、異なるスレッドがアクセスしていましたが、最後の COM インスタンスだけが使用可能になりました。この問題を解決できる何かを知っていますか?

100% cpu を達成するために、同じコンピューターでサービスの 2 つのプロセスを実行することを検討しています。これは、主にこのサーバーがインフラストラクチャの外部にインストールされるため、良い解決策ではありません.

4

3 に答える 3

2

複数の STA コンポーネントのトピックについて

同じ STA COM コンポーネントの 2 つのインスタンスを持ち、C# からそれらにアクセスすることができます。このようなシナリオを防ぐことができる唯一のものは、シングルトン オブジェクトとして実装されている場合、オブジェクト自体です。

ただし、両方のインスタンスが同じ STA スレッド上にある場合、いずれかのインスタンスでアクティブな呼び出しが行われると、そのスレッドへの他の呼び出しがブロックされます。したがって、これら 2 つのインスタンスを並行して動作させたい場合は、それらを別々の STA スレッドに配置する必要があります。安全のために、バックグラウンド スレッドで両方のインスタンスを作成します。これにより、UI がロックされるのを防ぐことができます。

外部コンポーネントの STA と MTA のトピックについて

コンポーネントが C であるために MTA オブジェクトになれない理由がわかりません。MTA であることは、オブジェクトが複数のスレッド間で状態アクセスと管理コードを内部的に同期する必要があることを意味します。

警告: 醜いハック! :-) 少し試してみたい場合は、レジストリに移動して外部コンポーネントのスレッド モデルを Apartment から Free に変更し、コードが MTA で適切に動作することを確認してください。ただし、それらのコンポーネントは、おそらくスレッドセーフ コードを記述しておらず、COM に保護を依存しているため、おそらく壊れるでしょう。

コードが機能せず、幽霊を追いかけるのに数え切れないほどの時間を費やしたシステムにならないように、後でその変更を元に戻すための目立つ場所にメモしてください. :-)

于 2008-11-10T17:00:57.447 に答える
0

フランシ・ペルノフ

2 つのスレッドで作業を試み、各スレッドのコンテキストで com インスタンスを初期化しましたが、エラーは同じです: (HRESULT からの例外: 0x80004005 (E_FAIL))

CallContext GetData および SetData を介してインスタンスを保存および取得しています。

于 2008-11-11T11:16:58.903 に答える
-1

同じ DLL を使用して 2 番目のクラスを登録してみてください。完全に安全にするために、別の名前の DLL の別のコピーが実際に必要になる場合があることを考慮してください。

STA COM クラス (およびおそらくその DLL) は、マルチスレッドに対してスレッド セーフとは見なされず、COM クラスの外部でできることは何もないことを覚えておいてください。

于 2008-11-10T16:59:52.143 に答える