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