背景:我有一个表单,它调用后台工作程序来进行一些强烈的计算。我将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和/或其成员是否有性能成本?记忆中实际发生了什么?
答案 0 :(得分:1)
通常 COM对象具有线程亲和性,但在您的情况下,您必须查看ILayer
的实现以找出其亲和性和公寓线程模型。如果你的对象具有线程亲和力,那么每次你调用ILayer
时,编组都会调用你ILayer
的拥有线程。这意味着如果你经常调用图层对象,你的后台线程和拥有COM对象的线程之间会有一个非常繁忙的通信,这可能导致性能比你想要的慢。
我上面的回答并不精确,因为COM对象拥有属于自己的世界,至少在我看来。对公寓,STA和MTA进行一些研究以获取更多信息。
我只是用Google搜索并看what我偶然发现了。汉斯的回答可能更准确地回答了你的问题。