- 在WPF,UWP,WinForm等类型的程序中,如果在主线程执行耗时的操作,就会导致整个程序无响应。因为主线程同时还需要处理消息循环,而渲染和鼠标键盘操作事件处理等工作,都是消息循环来执行的。
- 针对这种耗时的操作,一种流行的做法是启用一个worker线程。
- 执行完操作后,再更新到UI
- 富客户端应用的线程模型通常是:
- UI元素和控件只能从创建它们的线程来进行访问(通常是主UI线程)
- 当想从worker线程更新UI的时候,你必须把请求交给UI线程。
- 比较底层的是:
- WPF,在元素的Dispatcher对象上调用BeginInvoke或Invoke。
- WinForm,调用控件的BeginInvoke或Invoke(使用较多)
- UWP,调用Dispatcher对象上的RunAsync或Invoke。
- 所有这些方法都接收一个委托。
- BeginInvoke或RunAsync通过将委托排队到UI线程的消息队列来执行工作。
- Invoke执行相同的操作,但随后会执行阻塞,直到UI线程读取并处理消息。
- 因此Invoke允许从方法回去返回值。