将com对象传递给BackgroundWorker然后访问它是否有性能成本?

时间:2013-01-22 17:40:49

标签: c# .net com

背景:我有一个表单,它调用后台工作程序来进行一些强烈的计算。我将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和/或其成员是否有性能成本?记忆中实际发生了什么?

1 个答案:

答案 0 :(得分:1)

通常 COM对象具有线程亲和性,但在您的情况下,您必须查看ILayer的实现以找出其亲和性和公寓线程模型。如果你的对象具有线程亲和力,那么每次你调用ILayer时,编组都会调用你ILayer的拥有线程。这意味着如果你经常调用图层对象,你的后台线程和拥有COM对象的线程之间会有一个非常繁忙的通信,这可能导致性能比你想要的慢。

我上面的回答并不精确,因为COM对象拥有属于自己的世界,至少在我看来。对公寓,STA和MTA进行一些研究以获取更多信息。

我只是用Google搜索并看what我偶然发现了。汉斯的回答可能更准确地回答了你的问题。