当前位置: 首页 > 编程语言 > C#

为什么WPF中的UI控件有线程亲和性?分享

时间:2023-04-11 01:52:58 C#

为什么WPF中的UI控件会有线程亲和性?为什么创建控件的线程与可以更新它的线程相同?为什么MS不让人们可以使用锁定和其他线程同步技术在具有多线程的UI控件上读写属性。每个MSDN的简短描述是WPF的线程模型与现有的具有线程关联的单线程执行的User32线程模型同步。这样做的主要原因是互操作性——OLE2.0、剪贴板和InternetExplorer等系统都需要单线程关联(STA)执行并发和线程。WPF基于调度程序实现的消息传递系统。这很像熟悉的Win32消息泵;实际上,WPF调度程序使用User32消息来执行跨线程调用。在讨论WPF中的并发性时,需要了解两个核心概念-调度程序和线程关联。在WPF的设计阶段,目标是转移到单线程执行,但非线程“亲和力”模型。当组件使用执行线程的标识来存储某种类型的状态时,就会发生线程关联。最常见的形式是使用线程本地存储(TLS)来存储状态。线程亲和性要求每个逻辑执行线程仅由操作系统中的一个物理线程拥有,这可能会占用大量内存。最后,WPF的线程模型与现有的具有线程关联的单线程执行的User32线程模型保持同步。这样做的主要原因是互操作性——OLE2.0、剪贴板和InternetExplorer等系统都需要单线程关联(STA)执行。假设您有使用STA线程的对象,您需要一种方法在线程之间进行通信并验证您是否在正确的线程上。这就是调度员的作用。调度器是一个具有多优先级队列的基本消息调度系统。消息的示例包括原始输入通知(鼠标移动)、框架功能(布局)或用户命令(执行此方法)。通过派生自DispatcherObject,您可以创建具有STA行为的CLR对象,并在创建时为其分配一个调度程序。您可以在此处阅读全文就个人而言,我更喜欢WPF的单线程模型,而不是必须使用锁定和线程同步技术。Dispatcher可用于以不同的优先级将消息传递到主UI线程,这可以处理大多数小型后台进程,如果您需要任何繁重的处理,那么您仍然可以为此创建自己的后台线程。与所有UI工具包一样,WPF通过消息循环来工作。由于消息可以随时出现并影响任何控件,因此您需要一个全局锁。为了减少错误,您可能需要一个可以在锁下调用委托的函数。也许是这样的:Dispatcher.Invoke(Delegate,Object())将其编组到UI线程而不是获取全局锁的事实只是一个实现细节。以上是C#学习教程:为什么WPF中的UI控件有线程亲和性?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: