Application.DoEvents();


4

如何保持我的C#表单,让我们说是在for循环,从锁定?我打电话给Application.DoEvents();在循环之前或之后?从我听到的使用DoEvents方法会阻止我的应用程序锁定。

11

您不应该使用Application.DoEvents()以保持应用程序的响应。

调用此方法将允许任何等待的窗口消息被分派。这意味着如果用户点击一个按钮(或执行任何其他用户交互),该操作将被处理。这可能会导致重入。如果他们按下与正在处理的循环相同的按钮,则在完成之前,您将最终再次调用例程!

相反,您应该使用BackgroundWorker线程来执行较长的过程,然后一旦完成操作就执行所需的任何其他操作。例如,一旦按下按钮,您将启动工作线程,然后禁用您的按钮,因此无法再次按下按钮。一旦工作线程完成,您将再次启用该按钮。


1

有几种方法,这(DoEvents)只是强制消息泵来处理消息。有些人在一个线程中将一个Thread.Sleep放在循环的最后(总是在循环内)。你究竟在做什么,因为可能有更好的方法来完成你的目标?


1

如果该过程导致锁死为不可接受的时间量的用户界面中,尝试使用一个单独的线程(或者创建它,使用线程池,或者使用BackgroundWorker类。