type
status
date
slug
summary
tags
category
icon
password
Property
Aug 9, 2024 11:58 AM
富客户端应用程序的线程
在WPF、UWP、WinForm等类型的程序中,如果在主线程执行耗时的操作,就会导致整个程序无响应。因为主线程同事还需要处理消息循环(事件循环),而渲染和鼠标键盘事件等工作都是消息循环来执行的。
针对这种耗时操作,一种流行的做法是启用一个worker线程
执行完操作后,再更新到UI
富客户端应用的线程模型通常是:
UI元素和控件只能从创建他们的线程来进行访问(通常是主UI线程)
当想从worker此案城更新UI的时候,你必须把请求交给UI线程
比较底层的实现
- WPF 在元素的Dispatcher对象上调用BeginInvoke或Invoke
- WinForm调用控件的BeginInvoke或Invoke
- UWP 调用Dispatcher对象上的RunAsync或Invoke
所有的这些方法都接收一个委托
BeginInvoke或RunAs与内存通过将委托排队到UI线程的消息队列来执行工作
Invoke执行相同的操作,但随后会进行阻塞,直到UI线程读取并处理消息
Invoke允许从方法中获取返回值
如果不需要返回值。BeginInvoke\RunAsync更可取,因为他们不会阻塞调用方,也不会引入死锁的可能性
- 作者:Kitety
- 链接:https://www.kitety.com/article/c-sharp-async-thread-invoke
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章