代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

为什么需要control.invoke?

  •  1
  • Mongus Pong  · 技术社区  · 15 年前

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

    多年来,我一直承认这是必须的,但我一直不明白为什么。

    我能想到的唯一一件事是,代码是非常不安全的线程,而不是仅仅在控制代码中添加一点同步,框架只是解散它,并迫使我们走这条路-把婴儿与洗澡水一起扔出去!

    • 这纯粹是微软的懒惰,还是我只是没有得到什么?

    • 其他编程框架/其他操作系统是否也有类似的问题,或者只是Windows的问题?

    • 除了改变我们应用程序中的每一个功能,还有什么方法可以解决这个问题吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Erik Funkenbusch    15 年前

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

    当然,微软本可以在框架中设置同步以避免这个问题,但是这样做会给不需要这个功能的应用程序增加大量的性能开销(因为它们基本上是单线程的)。

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

        2
  •  0
  •   Darin Dimitrov    15 年前

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