WINDOWSFORMAPPLICATIONBASE.RUN(STRING())占用过多的CPU

时间:2014-01-16 07:38:05

标签: c# performance

大家好,我有一个相当简单的问题,我有一个多线程应用程序,用于执行一些定期的网络更新 我有一个表单说mainForm和一个CustomuserControl现在在我们的mainForm上显示网络更新我们有一个按钮,在这个按钮点击我们可以添加任意数量的CustomUSerControls,但它消耗了太多的内存和CPU使用,当我通过性能分析器,它包含在visual studio中,它向我展示了

MICROSOFT.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(string())

这个方法占用了近70-80的cpu用量,我不知道它占用了多少内存,任何人都可以解释它

2 个答案:

答案 0 :(得分:1)

你的UI代码中有一个循环,它正在不断地做某事并正在使用CPU。

检查您正在进行的任何轮询,并在轮询中暂停或将其更改为基于事件的系统,该系统仅在您的班级收到有可供处理的信息的信号时处理信息。

如果您已经在监听某个事件,但事件频繁被触发,您可能需要找到一种方法来减少被触发的事件数量,或者只在经过足够的时间后处理事件处理程序。

不幸的是,如果没有看到导致代码缓慢的确切代码,我就无法获得更具体的信息。我建议使用代码分析器来查找代码的哪些行(您向我们展示的行是.NET框架代码,您可以做的不多)被调用得最多并找出如何优化它们。

答案 1 :(得分:1)

首先你可以尝试使用      var p = System.Diagnostics.Process.Start(...)

(您可以使用p等待进程终止

后面的代码比你描述的方法更简单,更快。

另一种选择,如果您自动启动的网络应用程序也是.NET应用程序,并且您有源代码:

1)将网络应用程序拆分为两部分:加载程序(.exe文件)并将网络更新方法移动到.dll文件中(将库项目添加到解决方案中,并将更新方法使用的源文件移动到此新文件中)图书馆项目)。

2)在网络应用程序加载器和表单应用程序中添加对库项目的引用。

3)来自Form应用程序:不要启动网络应用程序加载器,而是直接调用Library项目中的网络更新方法。

使用第二种方法,表单应用程序只需要加载一个dll(比每次需要网络更新时启动一个新应用程序快得多)。