我有一个后台工作线程从网络源不断更新窗口中显示的数据。我也有一个按钮,可以发射一个事件。
我的问题是,在什么阶段(相对于后台工作人员执行)是执行的事件方法?是否与线程类似,它们同时发生?即,当我的按钮点击方法正在执行时,后台工作人员仍将继续运行?在这种情况下,我将需要使用锁定。或者后台工作人员会暂停,直到按钮点击方法终止?
答案 0 :(得分:3)
UI控件(例如按钮)引发的事件在主线程中执行,即a.k.a.UI线程。你自己提出的事件都是在你提出的任何线程上引发的。所有事件升级都会阻止自己的线程执行,直到完成为止。当你打电话给他们时,他们并不是很特别:只需要一点点语法糖就可以调用一个任意的代表名单。
在没有任何explicit synchronization代码的情况下,在后台嗡嗡作响的任何其他线程将会快乐地继续执行。
如果您需要或想要在UI线程中的事件处理程序和工作线程之间进行通信,则需要编写显式代码来执行此操作。这里没什么特别的:只有两个线程。
如果你有一个事件处理程序和一个线程将他们油腻的小手套放在同一个对象上,并且如果该对象上的操作不是原子的,那么你是正确的:你需要锁定。 Thread-safe collections may come in handy。