Visual Studio性能分析:Application.DoEvents()

时间:2011-02-07 16:21:28

标签: c# .net performance profiling

当我在Visual Studio 2010中剖析我的C#应用​​程序时,在Line View中,第二个最耗时的函数被列为System.Windows.Forms.Application.DoEvents()。列表中的第7个是System.Windows.Forms.Form.ShowDialog()。这两个消耗占总独占样品的约8%和2.5%。

该程序没有太多的用户交互。用户单击一个按钮,应用程序启动并运行其算法大约一分钟,然后停止。在此期间,没有用户交互,但是,使用了大量的CPU和IO。

我不确定我理解为什么上面两个函数(DoEvents和ShowDialog)捕获了这么多独占样本。这两个人有什么可以做的吗?

EDIT for Clarification:该应用程序有4个不同的主题。一个线程从外部设备读取数据并将其放入队列中。另一个线程,从队列中读取数据,并执行数据操作。此cpu密集线程将操纵数据放入另一个队列。第3个线程读取此队列并定期将数据写入磁盘。所有线程都实现为backgroundWorker。最后的(第4个)线程是应用程序主要的Form()本身。它实际上在整个过程中都处于非活动状态。

3 个答案:

答案 0 :(得分:1)

System.Windows.Forms.Application.DoEvents()几乎就像说“做所有GUI逻辑”。不建议使用DoEvents,甚至可能被认为是危险的,因为它在许多GUI情况下引入了竞争条件和未指定的行为。

答案 1 :(得分:1)

我认为你真正想知道的是 - 什么使得应用程序变慢,对吧? 如果问题只是为了好奇,请忘记这个答案。

虽然需要时间,只需点击暂停按钮,然后检查每个帖子中的堆栈。

做几次。您将确切地看到问题所在。

8%和2.5%的专属时间是纯粹无用的hoo-haw。您的代码中的某些调用(不是函数,函数调用)**在其中一个线程上堆叠百分比的时间。这是你的瓶颈,你看到它。

这是random-pausing技术,它只是起作用。

**有时这一点错过了。函数和函数调用之间的区别就像手提箱和握住手柄的手之间的区别。瓶颈不是函数,它是调用函数的一行代码(即使只是微代码)。调用该函数的其他代码行可能不是瓶颈。

答案 2 :(得分:0)

DoEvents用于处理Windows消息队列中的所有消息。您最好使用TPL或异步处理来执行长时间运行的任务。

此外,ShowDialog会阻止表单关闭。这个问题Is it possible to use ShowDialog without blocking all forms?比我更好地解释了这一点。

所有这些WinForms GUI事件和处理都是CPU密集型的,并且分析器非常清楚。您可能没有什么可担心的,只需使用线程完成长时间运行的任务。