2010-12-15 35 views
1

的我目前正在研究的是注入消息转换成经由COM的应用的侧由端应用(C#,的WinForms)。缺货PROC COM呆滞

本申请使用多个的foreach声明,从接受COM应用轮询实体的指标。 ListBox用于列出每个实体,当用户从该列表中选择一个时,将创建并执行一个线程,调用一个检索所需数据的方法。

当用户从列表中选择一个不同的实体,正在运行的线程被中止并且为新选择的实体创建一个新的线程。

我花了一天寻找到我的线程和内存使用情况,并得出一个结论,一切都很好。从来没有超过6个线程同时运行(所有执行不同成员都是唯一的),并且通过Windows任务管理器,我的应用程序从未达到峰值> 10 CPU%,29M MEM。

回答

2

想到的唯一情况是您正在使用的COM对象被设计为在单线程单元(STA)中运行。如果是这种情况,那么你开始有多少线程无关紧要;当调用这个COM对象时,它们最终都会被序列化。如果你的机器有多个核心,那么你肯定会看到少于100%的使用率。 10%似乎非常低。我不会惊讶地发现25%左右的东西基本上代表了四核心系统的一个挂钩核心,但是10%的数字可能需要另一个解释。如果您的代码或COM对象本身正在等待IO操作完成,那么可能会解释更多的低吞吐量。

0

你没有提到什么是缓慢的,所以这是很难说有把握什么。然而,既然你说你插入项目到一个列表框中,我会做一个完整的猜测并询问每次有多少项目?将大量项目插入列表框可能会非常缓慢。

如果是这样的话,你可以通过代替在一个列表框中列出每个实体来加速它,只在列表中列出一组类别,然后当用户选择一个类别时,你将填充另一个列表框,该类别。

+0

谢谢领先; ListBox包含不确定数量的实体..通常它包含大约5-15。 – wulfgarpro 2010-12-15 10:02:34

+0

@wulfgarpro:听起来似乎不太重要。但是,如果你一直在更新很多控件,乍得的答案可能对你有用。 – 2010-12-15 10:38:43

2

在的WinForms,你可以做SuspendLayout()ResumeLayout()。如果你插入了很多项目(或者通常做很多屏幕更新),你将首先调用SuspectLayout(),然后执行所有更新,然后执行ResumeLayout()。

+0

这可能是问题;数据不断更新TabControl中的一组8个文本框(每个文本框都指通过COM轮询的数据)。你认为这可能是由于速度问题? – wulfgarpro 2010-12-15 10:04:22

+0

@wulfgarpo - 我认为这是对它的贡献,我不明白它是如何可能会伤害尝试这个看看是否有帮助。但是,我不知道这是不是最大的原因。 – Chad 2010-12-15 10:10:15

+0

嗯,我会试试这个(不能在家工作)。我还将介绍该应用程序,看看是否可以找到任何瓶颈循环。我会及时向大家发布! – wulfgarpro 2010-12-15 10:15:50