解析.Net Micro Framework中的線程_.Net教程
推薦:如何在.Net Micro Framework中顯示漢字MF 平臺(tái)支持的字體是專有格式,擴(kuò)展名為 tinyfnt ,需要用專門的轉(zhuǎn)化工具才能把 windows 平臺(tái)上的字體轉(zhuǎn)換為 tinyfnt 字體。 在 .Net Micro Framework SDK 中提供了一個(gè)叫做 TFConvert.exe 的工具,我們可以用它在命令行下將 PC 機(jī)上的 TrueType 或者 OpenTy
摘要
新一代嵌入式微框架.Net Micro Framework提供了對線程調(diào)度的支持,和它的兩位前輩(.Net Framework, .Net Compact Framework)相比,Micro Framework并不需要依賴于OS提供的線程管理的服務(wù),因?yàn)镸icro Framework本身就是一個(gè)“類操作系統(tǒng)”。本文介紹了Micro Framework中的多線程原理,以及.Net Micro Framework中WPF的多線程編程。
簡介
作為.NET家族的一名新成員,.Net Micro Framework是微軟專門針對超輕量級(jí)平臺(tái)(主要是一些低端的32位微處理器)設(shè)計(jì)的軟件架構(gòu)。其結(jié)構(gòu)如圖1:

圖1. .Net Micro Framework 架構(gòu)
.Net Micro Framework有且僅有一條本地執(zhí)行線程,這條線程上跑的就是.Net Micro Framework CLR(TinyCLR)。TinyCLR是一個(gè)可以自己引導(dǎo)的運(yùn)行環(huán)境,和完整版本的.Net一樣會(huì)管理它自己涉及的內(nèi)存。所以可以認(rèn)為.Net Micro Framework不需要依賴操作系統(tǒng)提供線程和內(nèi)存管理的服務(wù)。所以,完全可以把.Net Micro Framework移植到?jīng)]有OS,甚至沒有內(nèi)存管理單元(MMU)的某些ARM7處理器上。
盡管只在單一的線程上執(zhí)行,但是CLR要求對驅(qū)動(dòng)的調(diào)用“看起來”是異步的,也就是說這些調(diào)用會(huì)立即返回,而不是一直阻塞直到該任務(wù)的硬件I/O完成。這和Windows下的APC(asynchronous procedure call)的實(shí)現(xiàn)非常類似。TinyCLR的線程調(diào)度依賴于APC的完成模式,APC的實(shí)現(xiàn)依賴于圖1中PAL層的定時(shí)器(Timer)的實(shí)現(xiàn),如圖2。

圖2. .Net Micro Framework上的異步調(diào)用
Micro Framework的基本線程操作
下面先簡單介紹幾種最基本的,在.Net Micro Framework被支持的線程相關(guān)方法:
1. Join
和完整版的.Net Framework一樣Micro Framework的System.Threading.Thread類提供了Join方法,所謂join(合并)用于使當(dāng)前線程等待直至調(diào)用該線程的方法執(zhí)行完畢或者到達(dá)指定的等待時(shí)間,這里不做多的介紹了。
2. Timer
這里是說System.Threading.Timer類,和完整版的.Net Framework一樣它的構(gòu)造函數(shù)中提供了一個(gè)TimerCallback委托類型的參數(shù)。它告訴線程池要拿出一個(gè)線程來按特定的時(shí)間或者頻率執(zhí)行這個(gè)callback函數(shù)。
3. Event
Micro Framework中線程可以用事件的方式來響應(yīng), 比如在訪問一些共享資源的時(shí)候可以使用AutoResetEvent, 通過Wait-Set的組合來同步線程。
以上幾種基本操作,在SDK的Threading例程中都有使用,這里不再贅述。
( Microsoft .NET Micro Framework\Samples\Threading )
WPF與Dispatcher
初次接觸.Net Micro Framework那WPF風(fēng)格的UI編程模型時(shí)(沒有Windows Forms),總是面臨著許多性能和安全上的問題。其中很常見的就是數(shù)據(jù)更新和界面刷新的問題。
典型的有UI的Micro Framework應(yīng)用程序都會(huì)有兩個(gè)邏輯線程,一個(gè)是開發(fā)者顯式創(chuàng)建用來處理硬件I/O的。另一個(gè)是由TinyCLR隱式創(chuàng)建并維護(hù)的,它用來處理所有的UI操作,我們姑且把it叫做WPF UI線程例如繪制UI元素,繪制控件和窗體等。
Micro Framework中的UI元素的更新,可以使用Dispacther和DispatcherTimer以線程安全的方式訪問UI元素。什么是Dispacther呢?你可以把它看作綁定在上述第二個(gè)線程上的一個(gè)消息隊(duì)列,WPF UI線程一直盯著這個(gè)隊(duì)列來接受各種操作命令。你只需要把你的命令,即相關(guān)待執(zhí)行的函數(shù),enqueue到這個(gè)隊(duì)列。即可讓這個(gè)函數(shù)獲得線程安全的執(zhí)行。
下面我們通過一個(gè)時(shí)鐘的例子來說明如何在Micro Framework中使用Dispatcher,在本例中我們會(huì)在一條單獨(dú)的線程上更新畫面上的文本。打開Visual Studio創(chuàng)建一個(gè)Micro Framework的windows程序
首先,在main函數(shù)之外,我們定義一個(gè)文本和負(fù)責(zé)更新它的線程:
|
以下為引用的內(nèi)容: private Text text; |
然后,我們需要為這個(gè)更新操作定義一個(gè)委托,這個(gè)委托的實(shí)例將被用來添加到WPF UI的“消息隊(duì)列”中去:
|
以下為引用的內(nèi)容: /// <summary> |
然后我們需要一個(gè)該委托的實(shí)例指向的實(shí)際函數(shù),它非常簡單:
|
以下為引用的內(nèi)容: public void UpdateText(String newText) |
接下來我們還需要讓UpdateThread做點(diǎn)什么,就是要它通過Dispatcher來完成這個(gè)異步的線程安全的UI更新:
|
以下為引用的內(nèi)容: public void UpdateTextThread() |
最后,我們要在CreatWindow方法返回前,添加如下代碼以啟動(dòng)上述線程:
|
以下為引用的內(nèi)容: updateThread = new Thread(new ThreadStart(UpdateTextThread)); |
其運(yùn)行效果如下:

注意這里我為了能讓大家看清楚,使用了較大的字體,如何為MF添加自定義的字體請參考:
http://www.chinaz.com/Program/.NET/0Fb22462009.html?1247102571
這種有周期的調(diào)用方式,還可以使用DispatcherTimer來處理,此時(shí)唯一需要改變的是UpdateText的簽名,使之符合EventHander的格式:
|
以下為引用的內(nèi)容: public void UpdateText(object sender, EventArgs e) |
使用DispatcherTimer非常簡單:
|
以下為引用的內(nèi)容: dispatchTimer = new DispatcherTimer(textView.Dispatcher); |
Micro Framework并不勝任所有情況
對于一些高吞吐量,且對實(shí)時(shí)性要求比較高的情景(比如一個(gè)需要對音頻數(shù)據(jù)流編解碼輸出CD音質(zhì)的設(shè)備),使用Micro Framework設(shè)備做這些工作并不是一個(gè)好的選擇。要滿足這樣的需求,你可以使用一些輔助的處理器(比如DSP),通過SPI或者I2C連接到Micro Framework設(shè)備。讓它們?nèi)プ龇敝氐臄?shù)據(jù)處理工作,而使用Micro Framework來創(chuàng)建友好的UI并承擔(dān)一些非嚴(yán)格實(shí)時(shí)性的工作。
另外一種方式就是把Micro Framework移植到一個(gè)多線程實(shí)時(shí)操作系統(tǒng)上,然后把那些實(shí)時(shí)性高的代碼交給一條高優(yōu)先級(jí)的線程去跑。
總結(jié)
NET Micro Framework 將 .NET 的可靠性和效率與 Visual Studio的高生產(chǎn)率結(jié)合起來,以針對價(jià)格較低、資源受限的小型設(shè)備開發(fā)應(yīng)用程序,可幫助人們使用熟悉的 Visual Studio 工具來構(gòu)建托管的嵌入式應(yīng)用程序。從中你可以發(fā)現(xiàn)使用托管代碼以O(shè)O的方式在嵌入式設(shè)備上面編寫擁有漂亮的UI的多線程程序是如此簡單自然。也許你再也不想回到過去那Win32或者POSIX風(fēng)格的代碼中去了。同時(shí)要注意Micro Framework的適用范圍,注意避免由MF直接承擔(dān)一些實(shí)時(shí)性較高的,大數(shù)據(jù)量的任務(wù)。
分享:解讀.net解決數(shù)據(jù)導(dǎo)出excel時(shí)的格式問題在項(xiàng)目中一般都需要將報(bào)表數(shù)據(jù)導(dǎo)出到EXCEL中,但經(jīng)常出現(xiàn)導(dǎo)出長串?dāng)?shù)據(jù)(如身份證)到EXCEL中后顯示為科學(xué)計(jì)數(shù)法的格式,或者報(bào)表中顯示為001的數(shù)據(jù)導(dǎo)出到Excel后成了1的格式。 下面簡單介紹一下以上問題的解決方法: 1、首先,了解一下excel從web頁面上導(dǎo)出的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-解析.Net Micro Framework中的線程
。