我正在研究其他人的代码,并且对与多线程有关的任何事情没有太多经验。我遇到了这行代码:
BeginInvoke((MethodInvoker)delegate() { btnCalibrate.PerformClick(); });
我想知道为什么要这样做,因为这样就可以工作:btnCalibrate.PerformClick();
感谢您的回答。
因为如果此代码在与在 GUI 中创建按钮的线程不同的线程中运行,则会引发异常。后台线程无法直接调用 GUI 上的方法,因为 GUI 不是线程安全的。
当然,这只是使用的合理理由BeginInvoke
!但是,发现包含无缘无故地添加的咒语或魔法咒语的代码并不罕见,因为作者已经看到了另一个这样做的示例,因此认为在所有情况下都必须有必要这样做。如果您正在使用的代码是单线程的,那么就没有必要。
特别是,Windows 窗体本身绝对是单线程的。所有窗口和控件上的所有操作都发生在同一线程上,并且它们的所有事件都在同一线程上触发。一个 GUI 线程的使用是通过一个消息循环来划分的,该消息循环在该线程上连续运行并从队列中读取消息。 BeginInvoke 的最终目的是向该队列发布一条消息,有效地表示“当您有时间时,请运行这段代码”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)