COM サーバーと通信してシミュレーションを行う C# プログラムを作成しました。問題なく動作しますが、COM サーバーによって実行されるシミュレーションはかなりプロセッサを集中的に使用し、シングル コアしか実行しません。
そのため、Parallel.Forを使用してワークロードを複数のスレッドに分散しました。ただし、COM サーバーによって生成されたすべてのシミュレーション結果は、そのクラスのすべてのインスタンス間で共有されているようです。そのため、1 つのスレッドのみで並列タスクを実行すると、すべてが期待どおりに機能しますが、タスクを複数のスレッドで実行すると、結果が完全に文字化けします (複数のスレッドが原因で、シミュレーション エンジンが結果を読み取り中に新しい結果に置き換えてしまうため)。
クラス インスタンスの結果共有を停止するために、COM サーバーに複数回接続する方法があるかどうか疑問に思っていました。
編集
COM サーバーに接続するための私のプロセスは次のとおりでした。
- Project->Add References->COM (VS2010) を使用して参照を追加します。
次のコードを使用して、シミュレーター オブジェクトをインスタンス化します。
dss = new OpenDSSengine.DSS(); dss.Start(0);
上記のコードはParallel.Forのローカル スレッド データ初期化子 (localInit) パラメーターで呼び出されるため、スレッドごとに新しいdss
オブジェクトが作成されますが、得られる結果はすべてのスレッドで共通のようです。
COM サーバーは dll です。