为什么Control.Invoke必要?

时间:2009-12-29 09:29:56

标签: .net multithreading

Control.Invoke在拥有控件底层窗口句柄的线程上执行指定的委托。

多年来我一直认为这是必须的,但我从未理解为什么。

我唯一能想到的是代码非常不安全,而不仅仅是在控制代码中添加一点同步,框架只是不允许它并迫使我们沿着这条路走下去 - 把宝宝扔出去洗澡水!

  • 这是微软的懒惰,还是有什么东西我还没有得到?

  • 其他编程框架/其他操作系统有类似的问题,还是只是Windows的事情?

  • 除了更改我们应用中的每个功能外,还有其他方法吗?

2 个答案:

答案 0 :(得分:5)

这是底层Windows用户界面的限制,与.NET框架本身几乎没有关系。在控件和窗口上执行许多操作(在Windows意义上,而不是组件模型意义上)要求在创建窗口句柄的线程上执行操作。 .NET框架就像任何其他应用程序一样,必须遵守此规则。

当然,微软本可以在框架中进行同步以防止出现这个问题,但这样做会为不需要该功能的应用程序增加大量的性能开销(因为它们主要是单线程的)。 p>

微软的决定是强迫那些需要开销的人明确地管理它而不是强迫每个人。

答案 1 :(得分:0)

在UI线程上有关于封送执行的深入review