猿问

使用Application.DoEvents()

使用Application.DoEvents()

可以Application.DoEvents()在C#中使用吗?

这个函数是否能够让GUI跟上应用程序的其余部分,就像VB6 DoEvents一样?


小怪兽爱吃肉
浏览 2196回答 4
4回答

BIG阳

它可以,但它是一个黑客。看DoDovents邪恶吗?。直接在MSDN页面是thedev引用:调用此方法会导致在处理所有等待窗口消息时挂起当前线程。如果消息导致触发事件,则可以执行应用程序代码的其他区域。这可能会导致您的应用程序出现难以调试的意外行为。如果执行需要很长时间的操作或计算,通常最好在新线程上执行这些操作。有关异步编程的更多信息,请参阅异步编程概述。所以微软警告不要使用它。此外,我认为它是一个黑客,因为它的行为是不可预测的和副作用倾向(这来自尝试使用DoEvents而不是启动新线程或使用后台工作程序的经验)。这里没有大男子主义 - 如果它作为一个强大的解决方案,我会全力以赴。但是,尝试在.NET中使用DoEvents只会给我带来痛苦。

缥缈止盈

是的,System.Windows.Forms命名空间中的Application类中有一个静态DoEvents方法。在UI线程中执行长时间运行的任务时,System.Windows.Forms.Application.DoEvents()可用于处理UI线程上队列中等待的消息。这样做的好处是,在长任务运行时,UI看起来更具响应性并且不会“锁定”。但是,这几乎总是不是最好的做事方式。根据微软调用DoEvents“...导致当前线程被暂停,同时处理所有等待窗口消息。” 如果触发事件,则可能会出现难以追踪的意外和间歇性错误。如果你有一个广泛的任务,最好在一个单独的线程中完成它。在单独的线程中运行长任务允许在不干扰UI继续平稳运行的情况下处理它们。看这里有更多细节。以下是如何使用DoEvents的示例; 请注意,Microsoft也提供了使用它的警告。

智慧大石

根据我的经验,我建议在.NET中使用DoEvents时要非常谨慎。在包含DataGridViews的TabControl中使用DoEvents时,我遇到了一些非常奇怪的结果。另一方面,如果你所处理的只是一个带有进度条的小表格,那么它可能没问题。底线是:如果您要使用DoEvents,则需要在部署应用程序之前对其进行彻底测试。
随时随地看视频慕课网APP
我要回答