偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

WPF與WinForm對(duì)比談 多線程編程優(yōu)化是關(guān)鍵

開(kāi)發(fā) 后端
對(duì)于WPF,很多人的觀點(diǎn)還是覺(jué)得它就是WinForm上加了一層皮。本文作者之前也是同樣的理解,不過(guò)在深入了解后,他發(fā)現(xiàn)其實(shí)二者最主要的區(qū)別就在于多線程編程優(yōu)化。

51CTO之前也曾報(bào)道過(guò)《Visual Studio 2010 RC中在WPF開(kāi)發(fā)方面有多個(gè)不同之處》,那么看來(lái)WPF還是有其可取之處,希望本文能對(duì)大家有所幫助。

很多人問(wèn)過(guò)我這樣一個(gè)問(wèn)題:WPF和以前的WinForm有什么區(qū)別?

我之前的回答一直是:沒(méi)什么區(qū)別,僅僅是表示層用XAML封了層皮,使得Windows看起來(lái)更炫了。

今天(確切的說(shuō)是昨天),我終于發(fā)現(xiàn)了我膚淺。首先我要澄清一下,WPF較之WinForm的先進(jìn)之處不止一點(diǎn)點(diǎn)。

對(duì)于WPF,很多人都以為這是微軟的一個(gè)小玩具,充其量就是讓Vista和Win7的表示層更炫了,然后就會(huì)吸引人們?nèi)ベ?gòu)買(mǎi)——當(dāng)然了,我相信多數(shù)人購(gòu)買(mǎi)Wim7的動(dòng)機(jī)并不在乎它的內(nèi)核做了什么變動(dòng)...

言歸正傳...

WPF將Windows表示層發(fā)展至用聲明式語(yǔ)言進(jìn)行開(kāi)發(fā),并且融入大量的動(dòng)畫(huà)和特效,使得在Win32中極難做到的富客戶端應(yīng)用能在WPF中信手拈來(lái),同時(shí)用矢量圖取代位圖,引入路由事件(RoutedEvent)對(duì)元素樹(shù)進(jìn)行多層監(jiān)聽(tīng),通過(guò)依賴屬性(DependencyProperty)動(dòng)態(tài)變更控件樹(shù)等,這些都是表面上我們所看到的。不過(guò)這些不是我今天想說(shuō)的重點(diǎn),何況有不少牛人的研究要比我深入多了,實(shí)在是自慚形穢啊,今天我只是承認(rèn)錯(cuò)誤來(lái)的。

在眾多WPF對(duì)于WinForm的優(yōu)勢(shì)中,令我意識(shí)到我之前的錯(cuò)誤的一點(diǎn)就是WPF對(duì)于多線程編程的優(yōu)化。

在WinForm程序開(kāi)發(fā)時(shí),一旦涉及多線程操作,我們一般不可能沒(méi)有見(jiàn)過(guò)InvalidOperationException這個(gè)異常。這個(gè)異常的出現(xiàn)多數(shù)情況是由于worker線程(子線程)修改主線程控件(或?qū)ο螅┑膶傩远鴮?dǎo)致的非法操作,當(dāng)然這種做法也非每次都會(huì)失敗,這主要取決于子線程想要操作的對(duì)象是不是線程安全的。

無(wú)論是Windows窗體還是WPF,問(wèn)題的成因都很簡(jiǎn)單:Windows控件使用的是組件對(duì)象模型(Component Object Model,COM)單線程單元(Single-threaded Apartment,STA)模型,因?yàn)槠涞讓拥目丶菃卧€程(apartment-threaded)的。此外,很多控件都用消息泵(message pump)來(lái)完成操作。因此,這種模型就需要所有調(diào)用該控件的方法都和創(chuàng)建該控件的方法位于同一個(gè)線程上。

WinForm控件提供了InvokeRequired屬性來(lái)判斷當(dāng)前線程是不是創(chuàng)建此控件的線程。一旦控件創(chuàng)建完成,那么InvokeRequired的效率將會(huì)不錯(cuò),且也能保證安全。不過(guò)若是目標(biāo)控件尚未被創(chuàng)建(此時(shí),雖然C#對(duì)象已經(jīng)存在,不過(guò)其底層的窗口句柄仍舊為null),那么InvokeRequired則可能會(huì)耗費(fèi)比較長(zhǎng)的時(shí)間。(它會(huì)從下至上遍歷整個(gè)控件樹(shù),直到找到一個(gè)可以承載此控件且已經(jīng)實(shí)例化并被創(chuàng)建了的父控件,這種做法可以保證子控件將會(huì)與父控件在同一個(gè)線程上創(chuàng)建。找到合適的父控件之后,框架即可執(zhí)行同樣的檢查,比較當(dāng)前線程的ID和創(chuàng)建該父控件的線程的ID。)。若是框架無(wú)法找到任何一個(gè)已創(chuàng)建的父窗體,那么則需要找到一些其他類型的窗體。若在層次體系中無(wú)法找到可用的窗體,那么框架將開(kāi)始尋找暫存窗體(parking window),暫存窗體讓你不會(huì)被某些Win32 API奇怪的行為所干擾。簡(jiǎn)而言之,有些對(duì)窗體的修改(例如修改某些樣式)需要銷毀并重新創(chuàng)建該窗體。暫存窗體就是用來(lái)在父窗體被銷毀并重新創(chuàng)建的過(guò)程中用來(lái)臨時(shí)保存其中的控件的。在這段時(shí)間內(nèi),UI線程僅運(yùn)行于暫存窗體中。

“通常,WPF 應(yīng)用程序從兩個(gè)線程開(kāi)始:一個(gè)用于處理呈現(xiàn),一個(gè)用于管理 UI。呈現(xiàn)線程有效地隱藏在后臺(tái)運(yùn)行,而 UI 線程則接收輸入、處理事件、繪制屏幕以及運(yùn)行應(yīng)用程序代碼。”

“UI 線程對(duì)一個(gè)名為 Dispatcher 的對(duì)象內(nèi)的工作項(xiàng)進(jìn)行排隊(duì)。 Dispatcher 基于優(yōu)先級(jí)選擇工作項(xiàng),并運(yùn)行每一個(gè)工作項(xiàng),直到完成。每個(gè) UI 線程都必須至少有一個(gè) Dispatcher,并且每個(gè) Dispatcher 都只能在一個(gè)線程中執(zhí)行工作項(xiàng)。”

                                                                                                                                ——MSDN

WPF開(kāi)始設(shè)計(jì)的時(shí)候,就將多線程的問(wèn)題考慮了進(jìn)去,上述很多過(guò)程都得到了簡(jiǎn)化。這得益于Dispatcher類的使用,每個(gè)線程都有一個(gè)Dispatcher。在第一次訪問(wèn)某個(gè)控件的Dispatcher時(shí),類庫(kù)將察看該線程是否已經(jīng)擁有了Dispatcher。若已經(jīng)存在,那么直接返回。如果沒(méi)有的話,那么將創(chuàng)建一個(gè)新的Dispatcher對(duì)象,并關(guān)聯(lián)在控件及其所在的線程之上。Dispatcher提供了類似InvokeRequired的方法(CheckAccess)【實(shí)際上并不提倡使用此方法,且在目前的WPF中此方法已經(jīng)被取消】。這個(gè)方法只是比較線程的ID,所以會(huì)很快。

另外,Dispatcher提供了優(yōu)先隊(duì)列(總共11個(gè)Priority,主要是用于WPF中UI的層次結(jié)構(gòu)設(shè)計(jì),比如動(dòng)畫(huà)的優(yōu)先級(jí)就是最高的);異步調(diào)用(WinForm中的Control.BeginInvoke和Control.EndInvoke也提供異步功能);DispatcherTimer (使用 DispatcherTimer 而不是使用 System.Timers.Timer 的原因是 DispatcherTimer 與 Dispatcher 運(yùn)行于相同的線程,并且可以在 DispatcherTimer 上設(shè)置 DispatcherPriority),簡(jiǎn)化了開(kāi)發(fā)多線程GUI程序。

WPF延伸閱讀

WPF框架圖

WPF框架圖

WPF為Windows Presentation Foundation的縮寫(xiě) ,其原來(lái)代號(hào)為“Avalon”,因“我佩服”拼音首字母組合一樣,國(guó)內(nèi)有人調(diào)侃地稱之為“我佩服”。WPF是微軟新一代圖形系統(tǒng),運(yùn)行在.NET Framework 3.0架構(gòu)下,為用戶界面、2D/3D 圖形、文檔和媒體提供了統(tǒng)一的描述和操作方法。基于DirectX 9/10技術(shù)的WPF不僅帶來(lái)了前所未有的3D界面,而且其圖形向量渲染引擎也大大改進(jìn)了傳統(tǒng)的2D界面,比如Vista中的半透明效果的窗體等都得益于WPF。 程序員在WPF的幫助下,要開(kāi)發(fā)出媲美Mac程序的酷炫界面已不再是遙不可及的奢望。 WPF相對(duì)于Windows客戶端的開(kāi)發(fā)來(lái)說(shuō),向前跨出了巨大的一步,它提供了超豐富的.NET UI 框架,集成了矢量圖形,豐富的流動(dòng)文字支持flow text support,3D視覺(jué)效果和強(qiáng)大無(wú)比的控件模型框架。

WinForm延伸閱讀

WinForm是.Net開(kāi)發(fā)平臺(tái)中對(duì)Windows Form的一種稱謂。.Net 為開(kāi)發(fā)WinForm的應(yīng)用程序提供了豐富的Class Library(類庫(kù))。這些WinForm 類庫(kù)支持RAD(快速應(yīng)用程序開(kāi)發(fā)),這些類庫(kù)被封裝在一個(gè)名稱空間之中,這個(gè)名稱空間就是System.Windows.Forms。在此名稱空間中定義了許多類,在開(kāi)發(fā)基于.Net的GUI應(yīng)用程序的時(shí)候,就是通過(guò)繼承和擴(kuò)展這些類才使得我們的程序有著多樣的用戶界面。

原文標(biāo)題:關(guān)于WPF,我個(gè)人長(zhǎng)期的誤解

鏈接:http://www.cnblogs.com/iamzhyk/archive/2010/04/07/1705903.html

【編輯推薦】

  1. 探討WPF開(kāi)發(fā)工作站相關(guān)知識(shí)
  2. WPF Dispatcher在界面操作中作用體現(xiàn)
  3. 實(shí)現(xiàn)WPF淡入效果方式技巧分享
  4. WPF Listbox生成方式介紹
  5. WPF邊框不同形式的設(shè)置技巧 
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2018-10-25 15:55:44

Java多線程鎖優(yōu)化

2010-01-07 09:53:09

Winform多線程編

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門(mén)

2024-11-01 08:00:00

2024-05-21 11:14:20

Python編程

2024-10-24 17:13:55

WinformUI多線程

2023-11-01 11:20:57

2023-06-13 13:39:00

多線程異步編程

2023-02-20 15:29:46

異步編碼多線程

2009-03-12 10:52:43

Java線程多線程

2011-06-10 14:13:24

關(guān)鍵詞

2023-04-02 17:53:10

多線程編程自測(cè)

2023-06-05 07:56:10

線程分配處理器

2023-06-06 08:17:52

多線程編程Thread類

2023-06-07 13:49:00

多線程編程C#

2009-11-17 10:47:14

Silverlight

2024-05-17 12:56:09

C#編程線程

2016-10-09 20:15:30

多線程多進(jìn)程

2013-07-16 12:13:27

iOS多線程多線程概念GCD

2011-06-13 10:41:17

JAVA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)