我相信这背后有一个好的(或至少还算合理的)原因。是什么呢?
TextBox.Text {get;set;}
这样的实例成员不是可重入的。myControl.BeginInvoke(myControl.UpdateFunction);
这样做是为了避免两个事物同时尝试更新控件。(如果CPU在写/读的中间切换到另一个线程,就会发生这种情况) 同样的原因,当访问多个线程之间共享的变量时,需要使用互斥锁(或其他同步方式)。
编辑:
在其他语言(如C++)中,您可以自由尝试并执行此操作(而不像WinForms中抛出异常),但最终会以艰难的方式学习!
啊,是的...我在C/C++和C#之间切换,因此比我应该的更通用,抱歉...他是正确的,你可以在C/C++中这样做,但它会回来咬你一口!
还需要在敏感于同时调用的更新函数中实现同步。对于 UI 元素来说,这样做在应用程序和操作系统层面上都是代价高昂的,并且对于绝大多数代码来说完全是多余的。
一些 API 提供了一种改变系统当前线程所有权的方法,因此您可以暂时(或永久)从其他线程更新系统,而无需采用线程间通信。
嗯,我不太确定,但我认为当我们有进度控件,如等待栏、进度条时,我们可以从另一个线程更新它们的值,一切都可以正常工作,没有任何故障。