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 回答