Control.Invoke在拥有控件的底层窗口句柄的线程上执行指定的委托(delegate)。
多年来,我只是接受这是必须的方式,但我一直不明白为什么。
我唯一能想到的就是代码是非常不安全的线程,而不是仅仅在控制代码中添加一点同步,框架只是不允许它并迫使我们走这条路——把婴儿和洗澡水一起扔出去!
最佳答案
这是底层 Windows 用户界面的限制,与 .NET 框架本身几乎没有关系。在控件和窗口上执行许多操作(在 Windows 意义上,而不是组件模型意义上)需要在创建窗口句柄的线程上执行这些操作。 .NET 框架与任何其他应用程序一样,必须遵守此规则。
当然,微软可以在框架中加入同步来防止这个问题,但是这样做会为不需要该功能的应用程序增加大量的性能开销(因为它们主要是单线程的)。
微软的决定是强制那些需要开销的人明确地管理它,而不是把它强加给每个人。
关于.net - 为什么 Control.Invoke 是必要的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973725/