为什么只有创建控件的线程才能更新它?为什么微软没有给人们在多线程读写UI控件属性时使用锁和其他线程同步技术的能力。
根据MSDN提供的简短描述:
WPF的线程模型与现有的User32线程模型保持同步,使用单线程执行和线程亲和力。 主要原因是为了实现互操作性 - 诸如OLE 2.0、剪贴板和Internet Explorer等系统都需要单线程亲和力(STA)执行。
更详细的描述如下:
大多数WPF对象都派生自DispatcherObject,它提供了处理并发和线程的基本结构。WPF基于由调度程序实现的消息系统。这与熟悉的Win32消息泵非常相似。事实上,WPF调度程序使用User32消息执行跨线程调用。您可以在这里阅读完整文章。
个人而言,我更喜欢WPF的单线程模型,而不是使用锁定和线程同步技术。Dispatcher可用于以不同的优先级级别将消息传递到主UI线程,这处理了大部分小型后台进程,如果需要任何重度处理,则仍然可以为此创建自己的后台线程。
WPF,就像几乎所有的UI工具包一样,通过消息循环来工作。由于消息可以随时到来并影响任何控件,因此您需要全局锁定。为了使其更少出错,您可能需要一个在锁定下调用委托的函数。也许像这样:
Dispatcher.Invoke(Delegate, Object())