type
status
date
slug
summary
tags
category
icon
password
Property
Sep 7, 2023 11:57 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更可取,因为他们不会阻塞调用方,也不会引入死锁的可能性
 
C#异步编程-08 信号简介《士兵突击》经典语录
  • Waline
Kitety
Kitety
独特为佳
公告
我曾经七次鄙视自己的灵魂
--卡里·纪伯伦
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
 
最新评论
Loading...