2011-02-07 133 views
1

当我在Visual Studio 2010中在Line View中剖析我的C#应用​​程序时,耗时第二的函数被列为System.Windows.Forms.Application.DoEvents()。列表中的第7个是System.Windows.Forms.Form.ShowDialog()。这两项消费量占总排他性样本的8%和2.5%。Visual Studio性能分析:Application.DoEvents()

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

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

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

+0

可以在DoEvents调用上处理画图和窗口更新事件。 Windows绘画很慢,但不应该担心什么。 – CodingBarfield 2011-02-07 17:21:01

回答

1

我假设你真正想知道的是 - 什么让应用变慢,对吧? 如果问题只是出于好奇,忘记这个答案。

尽管需要时间,只需点击暂停按钮,然后检查每个线程中的堆栈。

做几次。你会看到确切的问题。

8%和2.5%的专属时间是纯粹无用的胡ha。有些电话(不是功能,功能电话)**在您的代码是在其中一个线程堆栈%的时间。那是你的瓶颈,而你将会看到它。

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

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

0

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

此外,ShowDialog阻塞,直到窗体关闭。这个问题Is it possible to use ShowDialog without blocking all forms?解释这个比我能做得更好。

所有这些WinForms GUI事件和处理都是CPU密集型的,并且探查器正在非常清楚地说明。您可能没有什么可担心的,提供长时间运行的任务是通过线程完成的。

1

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

+0

我没有明确地调用我的代码中的任何地方的Application.DoEvents()。 – SomethingBetter 2011-02-07 16:36:40

+0

我会说它很危险。最好的例子是一个windows计时器,ticks不会自行禁用,然后执行一个比timer tick要长的操作,然后调用Application.DoEvents。这最终导致了一个stackoverflow! (真实世界的故事!) – Quibblesome 2011-02-07 19:05:54

相关问题