C#中的Application.DoEvents():一把双刃剑
在C#编程领域,使用Application.DoEvents()
来允许GUI处理消息仍然是一个有争议的话题。这个晦涩且可能危险的函数起源于VB6的DoEvents
,让许多开发者对其有效性存有疑虑。
C#中的Application.DoEvents()安全吗?
虽然C#中存在Application.DoEvents()
,但强烈建议不要使用它,因为它容易导致细微但灾难性的运行时错误。除非开发者彻底了解其复杂的运行机制以及如何防止用户输入对其的影响,否则它根本不值得冒险。
Application.DoEvents()究竟做了什么?
与普遍看法相反,Application.DoEvents()
不会执行GUI的部分更新。相反,它将控制权交给消息循环,允许处理任何和所有挂起的消息。本质上,它会暂停代码的执行,并允许GUI赶上进度,就像疲惫的徒步旅行者让出一条路让湍急的河流通过一样。
Application.DoEvents()的危险
Application.DoEvents()
的主要问题在于其不加区分的特性。通过让步给所有消息,它为一系列潜在的灾难打开了大门。例如,当Application.DoEvents()
循环正在勤奋地处理时,用户可能会关闭主窗口。虽然用户界面可能会暂时消失,但您的代码会继续运行,对即将造成的灾难一无所知。
当用户触发一系列事件导致第二次调用相同的Application.DoEvents()
循环时,就会出现另一种危险的情况。这会导致危险的嵌套循环级联,每个循环不知不觉地破坏前一个循环的工作,导致数据损坏和意外异常的混乱局面。
Application.DoEvents()的替代方案?
当然有!实现非冻结用户界面的推荐方法是利用线程或更现代的async
和await
关键字。这些技术提供了一种更结构化和更安全的方法来将UI处理与代码的其余部分解耦,从而避免了潜伏在Application.DoEvents()
阴影中的陷阱。
以上是application.doevents()安全吗?您是否应该在C#中使用替代方案?的详细内容。更多信息请关注PHP中文网其他相关文章!