2013-05-10 72 views
1

我有一个winforms应用程序调用Application.DoEvents()。现在应用程序在这个方法被调用时冻结(没有意外)。Application.DoEvents()并在某些机器上冻结

但是,这只发生在一些机器上。这是公平的说,这是由于机器本身,还是仍然是代码/ application.doevents()?在这种情况下,应该重构使用backgroundworker。

这是机器/环境问题还是oppurtunity使用backgroundworker?

+0

@editors我回滚了这个变化 - 它引入了比修正更多的问题,并且实际上并没有改善任何事情。 – 2013-05-10 13:18:01

+1

唯一公平的事情是,糟糕的编程实践会导致糟糕的程序以不可预知的方式行事不端。 – 2013-05-10 13:22:23

回答

6

如果可以,请使用后台工作程序。 DoEvents是一个'hack',它允许你的应用程序保持响应,并且在处理WM_PAINT消息时主要处理它实际上从不会在做:在主GUI循环中消息处理期间阻塞执行超过合理时间。如果DoEvents导致挂起而不是修复它,则会有太多消息花费太多系统权力。将它们一起分发给后台工作人员以便一次性修复所有内容 - 否则,“某些机器”成为“大多数机器”之前的时间只是时间问题。

+0

谢谢。我如何解释这个问题在所有机器上都不会发生? – dotnetdev 2013-05-10 15:04:21

+0

众多的可能性:竞争条件,不同的操作系统,不同的背景/前景作业数量,CPU速度,较慢的I/O子系统,您将其命名。 “系统过载”的问题在于它几乎总是基于阈值 - 只要能够在恒定负载下处理所有内容,一切都保持响应,但一旦达到阈值,就可以**不**,它将开始获得由于持续的涌入,拖延越来越迟。 “不”和“完全”超载之间的界限通常很薄。 – 2013-05-10 15:16:32

相关问题