WPF換膚之七 非同步

2021-09-07 20:15:29 字數 3367 閱讀 3397

原文:

wpf換膚之七:非同步

在winform時代,相信大家都遇到過這種情形,如果在程式設計過程中遇到了耗時的操作,不使用非同步會導致程式假死。當然,在wpf中,這種情況也是存在的,所以我們就需要尋找一種解決方法來讓程式介面響應和耗時操作非同步進行,那麼上述假死的情況就不會發生了。

這一節就著重講解非同步以及執行緒和介面互動。

非同步使用方式(apm模式)

在上節中,我們給乙個普通的window視窗做了換膚處理,呈現出了乙個非常酷的時區瀏覽小工具。當然,這一節,我們還是以那個工具為主,為其增加天氣預報功能,而天氣預報的資料**,則通過webservice來獲取。

首先,我們在程式中新增webservice服務引用,新增效果如下圖所示,我們需要用到其中的getweatherbycityname方法來獲取天氣預報資訊。

新增完成後,我們就可以通過下面的**來獲取城市的天氣資訊:

static weatherwebservicesoapclient weatherclient;   //

獲取氣象資訊的webservice物件

private

string getweather(string

cityname)

catch

(system.net.webexception webexception)

catch

(system.net.sockets.socketexception socketexception)

catch

(system.nullreferenceexception nullexception)

catch

(system.exception exception)

finally

return

weatherinfolist;

}

返回的陣列中包含的資料資訊如下:

#region content 

//直轄市

//上海

//58367

//2012-8-10 23:58:13

//27℃/33℃

//8月11日 陣雨轉多雲

//東南風4-5級

//今日天氣實況:氣溫:28℃;風向/風力:北風 1級;濕度:80%;空氣質素:良;紫外線強度:中等

//穿衣指數:天氣炎熱,建議著短衫、短裙、短褲、薄型t恤衫、敞領短袖棉衫等清涼夏季服裝。 感冒指數:暫無。 運動指數:有降水,風力較強,較適宜在戶內開展低強度運動,若堅持戶外運動,請選擇避雨防風地點。 洗車指數:不宜洗車,未來24小時內有雨,如果在此期間洗車,雨水和路上的泥水可能會再次弄髒您的愛車。 晾曬指數:有降水,可能會淋濕晾曬的衣物,不太適宜晾曬。請隨時注意天氣變化。 旅遊指數:有陣雨,氣溫較高,但風較大,能緩解濕熱的感覺,還是適宜旅遊,您仍可陶醉於大自然的美麗風光中。 路況指數:有降水,路面潮濕,車輛易打滑,請小心駕駛。 舒適度指數:天氣較熱,雖然有降水,但仍然無法削弱較高氣溫給人們帶來的暑意,這種天氣會讓您感到不很舒適。 空氣汙染指數:氣象條件有利於空氣汙染物稀釋、擴散和清除,可在室外正常活動。 紫外線指數:屬中等強度紫外線輻射天氣,外出時建議塗擦spf高於15、pa+的防曬護膚品,戴帽子、太陽鏡。

//27℃/34℃

//8月12日 多雲

//南風3-4級

//28℃/34℃

//8月13日 陣雨

//南風3-4級

//上海簡稱:滬,位置:上海地處長江三角洲前緣,東瀕東海,南臨杭州灣,西接江蘇,浙江兩省,北界長江入海,正當我國南北岸線的中部,北緯31°14′,東經121°29′。面積:總面積7823.5平方公里。人口:人口1000多萬。上海豐富的人文資源、迷人的城市風貌、繁華的商業街市和歡樂的節慶活動形成了獨特的都市景觀。遊覽上海,不僅能體驗到大都市中西合壁、商儒交融、八方來風的氛圍,而且能感受到這個城市**熙攘、車水馬龍、燈火璀璨的活力。上海在中國現代史上占有著十分重要的地位,她是中國**黨的誕生地。許多震動中外的歷史事件在這裡發生,留下了眾多的革命遺跡,處處為您講述著乙個個使人永不忘懷的可歌可泣的故事,成為包含民俗的人文景觀和紀念地。在上海,每到秋祭,紛至沓來的人們在這裡祭祀先烈、緬懷革命歷史,已成為了一種風俗。大上海在中國近代歷史中,曾是風起雲湧可歌可泣的地方。在這裡薈萃多少風雲人物,散落在上海各處的不同住宅建築,由於其主人的非同尋常,蘊含了耐人尋味的歷史意義。這裡曾留下許多革命先烈的足跡。瞻仰孫中山、宋慶齡、魯迅等故居,會使您產生撫今追昔的深沉遐思,這裡還有無數個達官貴人的住宅,探訪一下李鴻章、蔣介石等人的公館,可以聯想起主人那段顯赫的發跡史。

#endregion

現在,問題來了,如果我們在程式中直接呼叫這個介面來獲取天氣資訊的話,會發現主介面快則五六秒,慢則二十秒後才能夠顯現出來,這就說明,當程式獲取天氣資訊的時候,主介面被阻塞住了。為什麼會被阻塞,是因為程式本身只有一條主線程,當程式獲取天氣資訊的時候,執行緒占用,介面顯示當然不能進行了。解決方法就是使用非同步。

關於非同步的文章,請參看我之前的這篇博文:我所知道的.net非同步, 由於我是apm模式(就是begin***x和end***x成對出現)的忠實粉絲,所以採用的**如下:

private

void begininvokeweather(string

citiname)

)); }

catch

(exception ex)

}private

void

endinvokeweather(iasyncresult iar)

)); weatherimg.dispatcher.invoke(

new action(delegate

() ));}}

}

這樣,當程式啟動的時候,便會非同步獲取天氣資訊,介面阻塞的問題得以解決,請看圖示:

載入完成之後,我們就可以看到原來現在我在的地方是朗朗晴天呢... :d

當然,這裡還涉及到乙個問題,就是執行緒和ui互動的問題,在winform中我們可以通過control.invoke的方式來進行,在wpf中,只是多了乙個dispatcher而已,具體用法就是control. dispatcher.invoke來進行,比如載入天氣的label就是利用這種方式進行互動的:

lblloadingtext.dispatcher.invoke(new action(delegate

()));

希望本文對你有用。

WPF 實現換膚功能

將所有控制項的基本樣式匯集到乙個資源字典中,構成介面的基本樣式檔案,然後進行不同顏色 的定製。即在新的 資源字典檔案中引入基本樣式檔案,然後使用資源繼承,並且只設定控制項的顏色屬性等,形成乙個 檔案。注意 在設定不同 檔案時,不同控制項的樣式名字必須固定,只改變其顏色就能形成新的 因為在介面xaml...

WPF換膚之五 建立漂亮的窗體

原文 wpf換膚之五 建立漂亮的窗體 換膚效果 經過了前面四章的講解,我們終於知道了如何拖拉窗體使之改變大小,也知道了如何處理滑鼠事件,同時,也知道了如何利用更好的編寫方式來編寫乙個方便實用和維護的換膚程式。下面請看換膚效果 首先宣告,窗體樣式和按鈕樣式均來自於codeproject,本人美工太差 ...

WPF換膚之五 建立漂亮的窗體

原文 wpf換膚之五 建立漂亮的窗體 換膚效果 經過了前面四章的講解,我們終於知道了如何拖拉窗體使之改變大小,也知道了如何處理滑鼠事件,同時,也知道了如何利用更好的編寫方式來編寫乙個方便實用和維護的換膚程式。下面請看換膚效果 首先宣告,窗體樣式和按鈕樣式均來自於codeproject,本人美工太差 ...