0

バックグラウンド: バックグラウンド ワーカーを呼び出して高度な計算を行うフォームがあります。COM オブジェクトをオブジェクト配列に変換し、それをバックグラウンド ワーカーに渡します。バックグラウンド ワーカーでは、それらをアンパックして操作します。ILayer は com オブジェクトです。

コードは次のようになります。

private void run()
{
    ESRI.Geodatabase.ILayer layer1 = getLayer();
    ESRI.Geodatabase.ILayer layer2 = getLayer2();

    object[] args = {(object)layer1, (object)layer2};

    BackgroundWorker1.runAsynchronous(args);

}

private void backgroundworker_dowork(object sender, events e)
{
    object[] args = (object[])e.Argument;
    ESRI.Geodatabase.ILayer layer1 = (ILayer)args[0];
    ESRI.Geodatabase.ILayer layer2 = (ILayer)args[1];
    services.doIntensiveOperations(layer1, layer2);

}

私の質問は次のとおりです。バックグラウンド ワーカーから ILayer および/またはそのメンバーを繰り返し呼び出すと、パフォーマンス コストがかかりますか? ここでメモリ内で実際に何が起こっているのでしょうか?

4

1 に答える 1

1

通常、COM オブジェクトにはスレッド アフィニティがありますが、あなたの場合は、ILayerそのアフィニティとアパートメント スレッド モデルを見つけるために実装を調べる必要があります。オブジェクトにスレッド アフィニティがある場合、マーシャラーを呼び出すたびILayerに、所有するスレッドに呼び出しがディスパッチされますILayer。これは、レイヤー オブジェクトを頻繁に呼び出すと、バックグラウンド スレッドと COM オブジェクトを所有するスレッドとの間で非常に雑多な通信が行われ、必要以上にパフォーマンスが低下する可能性があることを意味します。

少なくとも私の意見では、COM オブジェクトには独自の世界があるため、上記の私の答えは正確ではありません。より多くの情報を得るために、アパート、STA、および MTA について調査してください。

私はただググって、私が見つけたものを見ました。ハンスからの回答は、おそらくあなたの質問により正確に答えます。

于 2013-01-22T17:58:29.857 に答える