我正在研究别人的代码,对于任何与多线程有关的内容都没有太多经验。 我发现了这一行代码:
BeginInvoke((MethodInvoker)delegate() { btnCalibrate.PerformClick(); });
我想知道为什么要这样做,而不是只用这个就可以了:btnCalibrate.PerformClick();
谢谢您的答案。
我正在研究别人的代码,对于任何与多线程有关的内容都没有太多经验。 我发现了这一行代码:
BeginInvoke((MethodInvoker)delegate() { btnCalibrate.PerformClick(); });
我想知道为什么要这样做,而不是只用这个就可以了:btnCalibrate.PerformClick();
谢谢您的答案。
更进一步解释@Earwicker的观点 - Control.BeginInvoke是一种将调用从一个线程转移到拥有Control实例的线程的方法。在后台,它使用Win32消息通过Win32函数PostMessage将调用传递到拥有线程上的PerformClick方法。这是由于Win32 Windows以及WinForms控件只能从创建它的线程安全访问,通常是运行GUI的单个线程。
之所以使用BeginInvoke而不是Invoke是因为前者使用PostMessage并立即返回,而后者使用SendMessage(在底层)并需要等待PostMessage并等待来自GUI线程的回复。这可能会延迟调用线程甚至锁定应用程序,因此在这里BeginInvoke是更好的选择。
void wm_OnWiimoteChanged
的函数中,在Form1.cs文件中,而btnCalibrate_performClick
则存在于同一文件中。那么,“不同的线程”从哪里来? - Aishwar