惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
S
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
N
News | PayPal Newsroom
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Project Zero
Project Zero
Cyberwarzone
Cyberwarzone
Vercel News
Vercel News
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
T
Tenable Blog
I
InfoQ
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
D
DataBreaches.Net
博客园 - Franky
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
S
Security @ Cisco Blogs
Hacker News: Ask HN
Hacker News: Ask HN
J
Java Code Geeks
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Full Disclosure
C
Cisco Blogs
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Cloudflare Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Fortinet All Blogs
Jina AI
Jina AI
V
Visual Studio Blog
L
LINUX DO - 热门话题
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏

博客园 - draeag

Linux下c++通过动态链接库调用类 环境变量设置 linux下获取时间差 gcc / g++ 编译选项 常用软件 MAC IP等相关 union内存分配方案 颜色表示 我看各平台的界面呈现 常用开发工具 委托与事件 [转载]HTTP协议详解 Get和Post方法的区别 Windows DNA .NET 运行原理之CLR .NET Framework/CLR之长短 COM, DCOM, COM+ , DTC, MSMQ,.NET Remoting,WCF COM线程模型概要 通信相关类
WPF之长短
draeag · 2012-02-11 · via 博客园 - draeag

在我看来,WPF是一个设计得很美的产品。WPF解决了传统Win32 UI程序的四大局限:1) Win32的绘图是由各自Window元素独立控制,基于GDI的。WPF引入了rendering thread来提高性能,优化算法,借用GPU加速。2) Win32依赖于GDI Object,在开发复杂窗口程序的时候,很容易就遭遇资源泄露和资源不足。比如早期的淘宝旺旺,开到几十个窗口的时候,程序就会出问题。所以淘宝针对这个问题,使用了统一控制台,合并多个窗口到标签页的方法来解决。而WPF只有最外面的窗口使用了Win32 Window和GDI,内部的元素都是抽象成了WPF自己的元素,不额外占用Win32 GDI资源的。3) Win32窗体程序严重依赖Windows Message模型。这要求程序员对系统知识有深入的了解。而且Win32 API并不是非常利于使用,比如要进行UI thread和Worker thread之间的通信,往往需要和SendMessage这样的API打交道。在WPF中,引入了Dispatcher类和BeginInvoke方法,把这些复杂问题抽象了。加上CLR提供了更方便高效的开发环境,使用WPF是很愉快的工作。4) Win32缺乏数据,设计和代码三者之间的模式抽象。这三者在WPF中对应了数据绑定,XAML文件,以及后台代码。在WPF中可以更直观地使用各种模式比如MVC和MVVM。这些都体现了WPF设计上的优美。

  再优美的东西都还是有局限性的。WPF的问题在于过多的模式和对CLR过度的依赖。了解WPF框架的人都知道,就一个简单的dependent property, 就把设计模式这本书里面的模式用掉一大半了。分析WPF框架代码的话,简直就是看一本设计模式的百科全书。我曾经统计过,关于mouse click这样一个event回调,WPF里面有7种不同的实现方法,分别各有好处,旨在解决不同问题。在这样高度灵活的背后,牺牲的是程序性能。无论是五花八门的模式,还是最常用的数据绑定,背后的主力都是CLR的reflection。过度依赖于reflection导致WPF程序规模一大,性能上就出问题。就算再怎么优化,也总找不到原生Win32程序那般流利的感觉。使用reflection也体现了对CLR的依赖。所以前面CLR的局限性,也适用于WPF。

语法标注解释 rendering 英音:['rendəriŋ] 表现;描写;渲染

invoke []  唤起

reflection英音:[ri'flekʃən] 反射