Application.DoEvents();

时间:2009-02-22 01:21:20

标签: c# multithreading

如何保持我的C#表单,让我们说是for-loop,从锁定?我是否调用Application.DoEvents();在循环之前或之后?据我所知,使用DoEvents方法将使我的应用程序无法锁定。

3 个答案:

答案 0 :(得分:12)

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

调用此方法将允许调度任何等待的Windows消息。这意味着如果用户单击按钮(或执行任何其他用户交互),则将处理该操作。因此,这可能导致重入。如果他们按下导致你正在处理循环的那个按钮,那么你最终会在你完成之前再次调用例程!

相反,您应该使用BackgroundWorker线程来执行长进程,然后在操作完成后执行所需的任何其他操作。例如,按下一个按钮后,您将启动工作线程,然后禁用您的按钮,以便不再按下它。工作线程完成后,您将再次启用该按钮。

答案 1 :(得分:1)

有几种方法,这个(DoEvents)只是强制消息泵处理消息。有些人在一个线程的循环结束时(总是在循环内)放置一个Thread.Sleep。您在线程中究竟做了什么,因为可能有更好的方法来实现您的整体目标?

答案 2 :(得分:1)

如果进程导致UI锁定了不可接受的时间,请尝试使用单独的线程(创建它,使用线程池或使用BackgroundWorker类。