为什么我应该从非ui线程调用Control.Invoke?

时间:2010-07-21 14:54:09

标签: winforms winapi

为什么我应该从非ui线程调用Control.Invoke?据我所知,任何控制操作都是要控制的信息。因此,当我调用时,例如TextBox.Text =“text”,它将产生消息SendMessage(TextBox.Hanlde ...)。该消息将排队到UI线程消息队列并由UI线程调度。为什么我必须调用invoke,即使它会产生相同的消息?

2 个答案:

答案 0 :(得分:1)

因为您无法直接从其创建的线程以外的线程访问UI控件。 Control.Invoke会将您的调用封送到正确的线程 - 允许您从另一个线程调用UI线程,而无需了解自己的UI线程是什么或如何执行编组。

更新回答您的问题, 使用Control.Invoke - 如果您有代码将您的呼叫编组到正确的线程上将消息发布到消息泵 - 然后使用它。然而,这被称为重新发明轮子。除非你正在做一些改变行为的事情。

答案 1 :(得分:1)

MS开发人员制定此限制有两个原因:

  1. 某些UI功能可以访问线程本地存储(TLS)。从另一个线程调用这些函数会在TLS操作中产生不正确的结果。

  2. 从同一个线程调用所有与UI相关的函数会自动对它们进行序列化,这是线程安全的,不需要同步。

  3. 从我们的观点来看,我们只需遵循这些规则。