C#学习教程:为什么WPF中的UI控件具有线程亲和力?分享


为什么WPF中的UI控件具有线程亲和力?

为什么创建控件的线程是可以更新它的线程? 为什么MS没有让人们能够使用锁定和其他线程同步技术来读取和写入具有多个线程的UI控件上的属性。

每个MSDN的简短描述是

WPF的线程模型与具有线程关联性的单线程执行的现有User32线程模型保持同步。 其主要原因是互操作性 – 像OLE 2.0,剪贴板和Internet Explorer这样的系统都需要单线程关联(STA)执行

更长的描述是这样的:

WPF中的大多数对象派生自DispatcherObject,它提供了处理并发和线程的基本结构。 WPF基于调度程序实现的消息传递系统。 这很像熟悉的Win32消息泵; 实际上,WPF调度程序使用User32消息来执行跨线程调用。

在讨论WPF中的并发时,有两个核心概念需要理解 – 调度程序和线程关联。

在WPF的设计阶段,目标是转移到单个执行线程,但是非线程“关联”模型。 当组件使用执行线程的标识来存储某种类型的状态时,就会发生线程关联。 最常见的forms是使用线程本地存储(TLS)来存储状态。 线程相关性要求每个逻辑执行线程仅由操作系统中的一个物理线程拥有,这可能会占用大量内存。 最后,WPF的线程模型与具有线程关联性的单线程执行的现有User32线程模型保持同步。 其主要原因是互操作性 – 像OLE 2.0,剪贴板和Internet Explorer这样的系统都需要单线程关联(STA)执行。

假设您有使用STA线程的对象,则需要一种在线程之间进行通信的方法,并validation您是否在正确的线程上。 这就是调度员的角色。 调度程序是一个基本的消息调度系统,具有多个优先级排队。 消息示例包括原始输入通知(鼠标移动),框架function(布局)或用户命令(执行此方法)。 通过派生自DispatcherObject,您可以创建具有STA行为的CLR对象,并在创建时为其指定调度程序。

你可以在这里阅读完整的文章

就个人而言,我更喜欢WPF的单线程模型而不是必须使用锁定和线程同步技术。 Dispatcher可用于将消息传递到不同优先级的主UI线程,这会处理大多数小型后台进程,如果您需要任何繁重的处理,那么您仍然可以为此创建自己的后台线程。

WPF,就像所有UI工具包一样,通过泵送消息循环来工作。 由于消息可以随时出现并影响任何控制,因此您需要全局锁定。 为了减少错误,您可能需要一个可以在锁定下调用委托的函数。 也许是这样的:

Dispatcher.Invoke(Delegate, Object()) 

这被编组到UI线程而不是获取全局锁的事实只是一个实现细节。

上述就是C#学习教程:为什么WPF中的UI控件具有线程亲和力?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1301138.html

(0)
上一篇 2023年1月8日 下午9:24
下一篇 2023年1月9日 上午9:15

精彩推荐