出于COM COM缓慢

时间:2010-12-15 08:41:52

标签: c# winforms multithreading

我目前正在开发一个并行应用程序(C#,WinForms),它通过COM将消息注入应用程序。

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

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

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

3 个答案:

答案 0 :(得分:2)

在WinForms中,您可以SuspendLayout()ResumeLayout()。如果您要插入大量项目(或者通常会进行大量的屏幕更新),您首先会调用SuspectLayout(),然后执行所有更新,然后再执行ResumeLayout()。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

如果是这种情况,您可以加快速度,而不是将每个实体列在一个列表框中,只在那里列出一组类别,然后当用户选择一个类别时,您将使用与该相关的实体填充另一个列表框类别。