【发布时间】:2010-07-21 14:54:08
【问题描述】:
为什么我应该从非 ui 线程调用 Control.Invoke?据我所知,任何带有控制的操作都是要控制的消息。所以当我打电话时,例如TextBox.Text =“text”,它会产生消息SendMessage(TextBox.Hanlde ...)。该消息将排入 UI 线程消息队列并由 UI 线程调度。为什么我必须调用invoke,即使它会产生相同的消息?
【问题讨论】:
为什么我应该从非 ui 线程调用 Control.Invoke?据我所知,任何带有控制的操作都是要控制的消息。所以当我打电话时,例如TextBox.Text =“text”,它会产生消息SendMessage(TextBox.Hanlde ...)。该消息将排入 UI 线程消息队列并由 UI 线程调度。为什么我必须调用invoke,即使它会产生相同的消息?
【问题讨论】:
MS 开发人员做出此限制的原因有两个:
某些 UI 函数可以访问线程本地存储 (TLS)。从另一个线程调用这些函数会导致 TLS 操作的结果不正确。
从同一个线程调用所有与 UI 相关的函数会自动将它们序列化,这是线程安全的,不需要同步。
在我们看来,我们只需要遵循这些规则。
【讨论】:
因为您不能从创建它们的线程以外的线程直接访问 UI 控件。 Control.Invoke 会将您的调用编组到正确的线程 - 允许您从另一个线程调用 UI 线程,而无需了解自己的 UI 线程是什么或如何执行编组。
更新:回答你的问题,你没有有使用Control.Invoke - 如果你有代码将你的调用编组到正确的线程并发布向消息泵发送消息 - 然后使用它。然而,这被称为重新发明轮子。除非你正在做一些改变行为的事情。
【讨论】: