为什么只允许UI线程修改UI?

Tal*_*ner 21 c# multithreading

我知道如果我从不同的线程修改控件,我应该小心,因为WinForms和WPF不允许从其他线程修改控件的状态.

为什么会有这种限制?

如果我可以编写线程安全的代码,我应该能够安全地修改控制状态.那为什么会出现这种限制?

Bri*_*sen 23

一些GUI框架具有此限制.根据Java Concurrency in Practice这本书的原因是为了避免复杂的锁定.问题是GUI控件可能必须对来自UI,数据绑定等的两个事件作出反应,这导致从几个不同的源锁定并因此导致死锁的风险.为了避免这种情况,.NET WinForms(和其他UI)将对组件的访问限制为单个线程,从而避免锁定.

  • Windows不会限制对拥有线程的访问。.NET引入了该限制。 (2认同)

Ste*_*ger 9

在窗口的情况下,当创建控件时,通过来自消息泵的消息执行UI更新.程序员没有直接控制泵运行的线程,因此控制消息的到达可能导致控制状态的改变.如果允许另一个线程(程序员直接控制)改变控件的状态,则必须设置某种同步逻辑以防止控制状态的损坏..Net中的控件不是线程安全的; 这是我怀疑的设计.在设计,开发,测试和支持提供此功能的代码方面,将同步逻辑放在所有控件中将是昂贵的.程序员当然可以为控件提供线程安全性对于他自己的代码,但不是与.Net中的代码同时运行的代码.此问题的一个解决方案是将这些类型的操作限制为仅一个线程和一个线程,这使得.Net中的控制代码更易于维护.