为了账号安全,请及时绑定邮箱和手机立即绑定

使用Application.DoEvents()

使用Application.DoEvents()

小怪兽爱吃肉 2019-05-25 16:18:32
使用Application.DoEvents()可以Application.DoEvents()在C#中使用吗?这个函数是否能够让GUI跟上应用程序的其余部分,就像VB6 DoEvents一样?
查看完整描述

4 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

它可以,但它是一个黑客。

DoDovents邪恶吗?

直接在MSDN页面thedev引用:

调用此方法会导致在处理所有等待窗口消息时挂起当前线程。如果消息导致触发事件,则可以执行应用程序代码的其他区域。这可能会导致您的应用程序出现难以调试的意外行为。如果执行需要很长时间的操作或计算,通常最好在新线程上执行这些操作。有关异步编程的更多信息,请参阅异步编程概述。

所以微软警告不要使用它。

此外,我认为它是一个黑客,因为它的行为是不可预测的和副作用倾向(这来自尝试使用DoEvents而不是启动新线程或使用后台工作程序的经验)。

这里没有大男子主义 - 如果它作为一个强大的解决方案,我会全力以赴。但是,尝试在.NET中使用DoEvents只会给我带来痛苦。


查看完整回答
反对 回复 2019-05-25
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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

以下是如何使用DoEvents的示例; 请注意,Microsoft也提供了使用它的警告。


查看完整回答
反对 回复 2019-05-25
?
智慧大石

TA贡献1946条经验 获得超3个赞

根据我的经验,我建议在.NET中使用DoEvents时要非常谨慎。在包含DataGridViews的TabControl中使用DoEvents时,我遇到了一些非常奇怪的结果。另一方面,如果你所处理的只是一个带有进度条的小表格,那么它可能没问题。

底线是:如果您要使用DoEvents,则需要在部署应用程序之前对其进行彻底测试。


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 2195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信