为什么需要Control.Invoke?
问题描述:
Control.Invoke在拥有控件底层窗口句柄的线程上执行指定的委托。为什么需要Control.Invoke?
多年来,我刚刚接受,这是它必须的方式,但我从来没有明白为什么。
我能想到的唯一的事情是代码是非常不安全的代码,而不是仅仅在控制代码中添加一点同步,框架只是不允许它,并迫使我们放弃这条路线 - 洗澡水!
难道是微软懒惰,还是有东西我只是没有得到?
做其他的编程框架/其他操作系统也有类似的问题,还是仅仅是一个Windows的事情吗?
除了改变我们的应用程序中的每个功能,有没有办法解决它?
答
这是底层Windows用户界面的限制,与.NET框架本身无关。在控件和窗口上执行许多操作(在Windows中,而不是组件模型意义上)需要在创建窗口句柄的线程上执行操作。 .NET框架就像任何其他应用程序一样,必须遵守此规则。
当然,微软可能会在框架中同步化以防止此问题,但这样做会为不需要该功能的应用程序增加大量性能开销(因为它们主要是单线程的)。
微软的决定是强制那些需要开销的人明确地管理它,而不是强迫每个人。
好吧,我明白不想有额外的性能开销,但难道不类似的开销框架调用Control.Invoke本身,而不是提高“跨线程操作无效:控制‘的名字在这里’从访问一个线程,而不是它创建的线程“异常? – 2009-12-29 09:43:30
调用Control.Invoke有一定的责任,框架不能简单地假定应用程序知道。例如,如果你不小心,你可以创建死锁情况,如果框架只是为你做的,它可能会在你不知情的情况下创建死锁。这是一个很好的例子http://social.msdn.microsoft.com/forums/en-US/clr/thread/a35e5298-33c4-4461-b956-bf265484219e – 2009-12-29 09:48:08
好吧,是的,我明白这一点。谢谢,这有点让我感到困惑! – 2009-12-29 10:21:44