我知道,当您是调用者、调用方法或以其他方式操作控件时,您应该调用 UI 线程(或无论如何拥有该控件的线程)来执行此操作。
但是,当控件通过其事件之一被回调时,假设您在正确的线程上被调用是否安全?
根据我对常用控件的经验,这总是正确的,但也许这只是因为大多数事件是用户交互的结果,因此 Windows 消息由 UI 线程上的主消息循环处理。
最近我遇到了一个我自己的自定义控件的问题,它调用事件的原因不是响应用户交互,有时是在后台线程上调用的。在一种情况下,该事件的事件处理程序试图操纵另一个产生非法跨线程调用异常的控件。
我可以通过检查我的事件处理程序中是否需要调用来解决问题,但我很想知道谁在这里实际上是“有过错”的。
我在任何地方都找不到任何说明有关控件事件的任何“规则”甚至最佳实践的文档。有人知道吗?或者,在您看来,是否应该由控件负责在正确的线程上调用订阅者或订阅者负责检查?
编辑:似乎没有人听说过任何记录在案的约定,但普遍认为最好Control
在控件所属线程的派生类上调用公共事件,以避免让消费者感到惊讶。