gpt4 book ai didi

c# - 为什么要在这里使用 BeginInvoke?

转载 作者:太空狗 更新时间:2023-10-30 00:46:49 24 4
gpt4 key购买 nike

我正在研究其他人的代码,但对多线程没有太多经验。我遇到了这行代码:

BeginInvoke((MethodInvoker)delegate() { btnCalibrate.PerformClick(); });

我想知道为什么这样做,而只是这样做会起作用:btnCalibrate.PerformClick();

感谢您的回答。

最佳答案

因为如果此代码在与在 GUI 中创建按钮的线程不同的线程中运行,则会抛出异常。后台线程不能直接调用 GUI 上的方法,因为 GUI 不是线程安全的。

当然,这只是使用BeginInvoke的合理原因!但是,发现包含无缘无故放入的咒语或魔法咒语的代码并不罕见,因为作者看到了另一个这样做的例子,因此假设在所有情况下都必须这样做。如果您使用的代码是单线程的,则没有必要。

尤其是,Windows 窗体本身绝对是单线程的。所有窗口和控件上的所有操作都发生在同一个线程上,并且它们的所有事件都在同一个线程上触发。一个 GUI 线程的使用是通过一个消息循环来划分的,该消息循环在线程上连续运行并从队列中读取消息。 BeginInvoke 的最终目的是向该队列发布一条消息,有效地说“当您有时间时,请运行这段代码。”

关于c# - 为什么要在这里使用 BeginInvoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com