【问题标题】:Heavy Load Application Freezes重负载应用程序冻结
【发布时间】:2012-05-01 15:28:22
【问题描述】:

我们有一个客户端-服务器 C# 应用程序,当我们使用一些脚本在 UI 中创建 1000 个或更多种类的对象时,它会冻结,而不是在 UI 中单独创建它。

我们为某些事件使用了很多事件处理程序,但据我了解,所有线程(UI 和后台)和事件处理程序都在正确管理。然后我们的客户端应用程序也会冻结。我们不知道它背后的确切原因是什么。 高峰时间挂起应用程序占用了大约 16 个线程。任务管理器报告它占用了超过 90% 的 CPU 时间。

谁能告诉我背后的原因

   [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.DoEvents();
            Application.Run(new Test());
        }

更新

我如何将延迟加载应用到 Treeview、Listview 和 propertygrid。我使用了 beginupdate、endupdate、双缓冲,除了这些任何方法??

更新

高 CPU 使用率是什么意思,我的应用程序 exe 以 13 个线程挂起,在某些地方我听说如果您使用 ThreadPriority.Lowest 它会降低 CPU 使用率,它还能工作吗?我不知道在哪里正确使用它?

【问题讨论】:

  • 它会“解冻”,还是永远“冻结”?
  • 根据给出的信息,我们只能猜测。您可能会用完 GUI 资源。
  • 尝试创建问题的最小再现,然后发布代码。事实上,我们仅限于猜测。
  • 这些对象是控件吗?听起来像是延迟加载的好选择,即在用户向下滚动页面时按需加载项目。
  • 前端是WPF还是Winforms?如果 WPF(并假设问题在于创建数千个控件),那么您可以使用 WPF 容器,该容器使用虚拟化堆栈面板(如带有 DataTemplate 的列表框)来处理 James Johnson 所写的控件的延迟加载在他的评论中。

标签: c# .net multithreading event-handling


【解决方案1】:

听起来您需要某种延迟加载技术来在用户向下滚动表单时按需加载控件。一次加载这么多控件将不可避免地锁定应用程序。

这篇文章提供了一些关于如何提高 winform 应用程序性能的好技巧:

【讨论】:

  • 我检查了这个链接,并用我的应用程序验证了几乎所有这些都已被使用。当通过任何脚本或任何 bat 文件或通过操作系统命名管道创建突然的对象时,它仍然挂起。那个时间它需要超过 90% 的 CPU 时间。当对象创建某种自动化时,还有一件事也在进行
  • 我如何将延迟加载应用到 Treeview、Listview 和 propertygrid。我使用了 beginupdate、endupdate、双缓冲,除了这些任何方法??
  • 高 CPU 使用率是什么意思,我的应用程序 exe 挂起 13 个线程,我听说如果你使用 ThreadPriority.Lowest 会降低 CPU 使用率,它还能工作吗?我不知道在哪里正确使用它
【解决方案2】:

Treeviews 和 Listviews 本身效率不高,而且没有添加大量逻辑。如果您没有时间优化它们,您可能需要查看第三方解决方案,例如 AMAZING 开源 ObjectListView。

它有几种处理特定情况的方式,例如处理数百万条记录的 FastObjectListView 或处理层次结构的 TreeListView!

要掌握它确实需要一些努力,但远不及将 Treeviews 和 Listviews 制作成......以及 ObjectListViews :D

http://objectlistview.sourceforge.net

http://objectlistview.sourceforge.net/cs/recipes.html#what-flavour-of-objectlistview-do-i-want-to-use

http://objectlistview.sourceforge.net/cs/recipes.html

http://objectlistview.sourceforge.net/cs/gettingStarted.html

我自己在几个项目中使用它并取得了巨大的成功!

干杯,

【讨论】:

  • 高 CPU 使用率是什么意思,我的应用程序 exe 挂起 13 个线程,我听说如果你使用 ThreadPriority.Lowest 会降低 CPU 使用率,它还能工作吗?我不知道在哪里正确使用它
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2015-05-09
  • 2013-09-26
  • 2014-09-29
  • 2016-02-10
相关资源
最近更新 更多