我有一个自定义控件,其主要目的是绘制数据。我想向控件添加一个ScheduleUpdate(int milliSeconds)方法,这将从现在开始强制更新X毫秒。
由于这是所有的GUI,我应该使用Windows.Forms.Timer,但是这个计时器实例如何知道它属于哪个线程?如果从非UI线程调用ScheduleUpdate(),该怎么办?
我应该在Control构造函数中构造计时器吗?或者也许是Load事件?或者,在我进入ScheduleUpdate()之前推迟构建是否安全?
我知道有一些非常相似的问题,但我不我的控件上有一个Timer组件,我正在根据需要构建它。< / p>
答案 0 :(得分:1)
它知道,因为它知道它是在哪个线程上创建的。有一个隐形的辅助窗口,它接收WM_TIMER消息,然后触发Tick事件。窗口具有线程亲和性,线程上的消息循环调度消息。哪个应该是您应用的UI线程。
确保在与表单及其控件相同的线程上创建此计时器。只需将其放在表单上或在表单或控件构造函数中创建它。然后,您只需将计时器的Enable属性设置为true即可。这是线程安全的,你可以在调度程序线程上执行此操作。