导航

WPF 学习

Posted on 2007-12-10 13:28  Jonathan Shen  阅读(159)  评论(0)    收藏  举报
 

这两天学WPF,发现一个牛人的blog:

http://www.cnblogs.com/sheva/
http://shevaspace.spaces.live.com

这位兄弟是MSDN WPF讨论组的守护神。据我观察,发到下面这个MSDN论坛的所有疑难杂症,直接被这位兄弟咔嚓掉
http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=119&SiteID=1

今天晚上花了两个小时,把大牛的blog翻了个遍,把能看懂的都看了,收益良多。一方面这位大哥证明了我的一些猜想,另一方面我从中了解到WPF的常见陷阱,跟重要的是,这位英才的blog旁征博引,让我找到好多其它优秀的WPF连接。

其中让我觉得发人深省的是这个:
http://shevaspace.spaces.live.com/blog/cns!FD9A0F1F8DD06954!546.entry

对于一个我这样的菜鸟来说,首先想到的是,原来WPF databinding不能跨thread阿,我还不知道呢,受小弟一拜。看完了文章,觉得带头大哥威力无边,从问题的描述到解决方案,尽善尽美。意犹未尽之于,看看文章的评论,才想到发现原来这个解法还是存在问题。


databinding的设计上说,事情分三步走

1. 某个地方改变了数据
2.
数据源通过databindingevent通知UI
3. UI
取得新的数据,更新UI

但是问题是,这三个步骤必须考虑线程安全,或者说应该是原子操作。怎么说,如果在第三步,UI thread取数据的时候,另外一个worker thread又发起了一次数据改变,如果没有考虑线程安全,就有问题了。

作为WPF的设计者,databinding可以发生在各种类型的class上面。所以WPF设计者不能强求使用data binding的程序员都自己去考虑线程安全,所以采取的解决办法就是一律走UI threadDispatcher object。如果程序员自己要玩,那自己一定要弄清楚自己在做啥。

Dispatcher就是WPF的命脉。事件何时处理,UI何时重新计算,MediaContext如何跟render thread通信,data binding何时触发,全靠这玩意。就跟STAWindows Message一样

牛人就是这样,不仅仅帮你学你想学的东西,还让你思考你不曾想过的问题。