【问题标题】:Out of proc COM sluggishnessOut of proc COM 迟缓
【发布时间】:2010-12-15 08:41:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# winforms multithreading


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这可能是问题所在;数据不断更新 TabControl 中的一组 8 个文本框(每个都引用通过 COM 轮询的数据)。您认为这可以归因于速度问题吗?
      • @wulfgarpo - 我认为这是促成了它,我不明白尝试这个看看它是否有帮助会有什么伤害。但是,我不知道这是否是最大的原因。
      • 嗯,我会试试这个(不能在家工作)。我还将分析应用程序并查看是否可以找到任何瓶颈循环。我会及时通知你的!
      • 我把它放好了..它并没有太大变化。
      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的领导; ListBox 包含不确定数量的实体。通常它包含大约 5-15 个。
      • @wulfgarpro:那听起来不太重要。但是,如果您确实一直在更新很多控件,Chad 的回答可能会很有用。
      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2011-12-30
      • 2011-08-14
      • 2017-05-30
      • 2019-08-28
      • 2014-05-06
      • 2010-12-07
      相关资源
      最近更新 更多