type
Post
status
Published
date
Sep 5, 2023
slug
c-sharp-async-thread-invoke
summary
C#异步编程-09 富客户端应用处理耗时操作
tags
C#
CS
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 许可协议,转载请注明出处。
相关文章


.png?table=block&id=fa81f9ab-c0da-4f4e-a935-0567380c36d0&t=fa81f9ab-c0da-4f4e-a935-0567380c36d0&width=1080&cache=v2)
.png?table=block&id=55df38cd-a361-41ee-a75d-c17615e78d6b&t=55df38cd-a361-41ee-a75d-c17615e78d6b&width=1080&cache=v2)
_(1).jpg?table=block&id=a716c7ee-7105-4a3f-8133-a15129086419&t=a716c7ee-7105-4a3f-8133-a15129086419&width=1080&cache=v2)
.jpg?table=block&id=2e9784d9-1d6e-44fc-9106-f0c576ddcb8f&t=2e9784d9-1d6e-44fc-9106-f0c576ddcb8f&width=1080&cache=v2)

.png?table=block&id=c0772cdb-ee08-49f4-b2f3-c804586bb769&t=c0772cdb-ee08-49f4-b2f3-c804586bb769&width=1080&cache=v2)

.png?table=block&id=b43ea4ae-a57d-4962-80ba-12280979702b&t=b43ea4ae-a57d-4962-80ba-12280979702b&width=1080&cache=v2)
