新聞中心
C#代碼協(xié)同執(zhí)行的支持機(jī)制

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都做網(wǎng)站、鳳岡網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、鳳岡網(wǎng)絡(luò)營(yíng)銷、鳳岡企業(yè)策劃、鳳岡品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供鳳岡建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
幾個(gè)月前我曾大致分析過(guò) C# 2.0 中 iterator block 機(jī)制的實(shí)現(xiàn)原理,《C# 2.0 中Iterators的改進(jìn)與實(shí)現(xiàn)原理淺析》,文中簡(jiǎn)要介紹了 C# 2.0 是如何在不修改 CLR 的前提下由編譯器,通過(guò)有限狀態(tài)機(jī)來(lái)實(shí)現(xiàn) iterator block 中 yield 關(guān)鍵字。實(shí)際上,這一機(jī)制的最終目的是提供一個(gè)C#代碼協(xié)同執(zhí)行的支持機(jī)制。
- using System.Collections.Generic;
- public class Tokens : IEnumerable
- {
- public IEnumerator
GetEnumerator() - {
- for(int i = 0; i
; i++) - yield elements[i];
- }
- }
- foreach (string item in new Tokens())
- {
- Console.WriteLine(item);
- }
在這段代碼執(zhí)行過(guò)程中,foreach 的循環(huán)體和 GetEnumerator 函數(shù)體實(shí)際上是在同一個(gè)線程中交替執(zhí)行的。這是一種介于線程和順序執(zhí)行之間的協(xié)同執(zhí)行模式,之所以稱之為協(xié)同(Coroutine),是因?yàn)橥瑫r(shí)執(zhí)行的多個(gè)代碼塊之間的調(diào)度是由邏輯隱式協(xié)同完成的。順序執(zhí)行無(wú)所謂并行性,而線程往往是由系統(tǒng)調(diào)度程序強(qiáng)制性搶先切換,相對(duì)來(lái)說(shuō)Win3.x 中的獨(dú)占式多任務(wù)倒是與協(xié)同模型比較類似。
就協(xié)同執(zhí)行而言,從功能上可以分為行為、控制兩部分,控制又可進(jìn)一步細(xì)分為控制邏輯和控制狀態(tài)。行為對(duì)應(yīng)著如何處理目標(biāo)對(duì)象,如上述代碼中:行為就是將目標(biāo)對(duì)象打印到控制臺(tái);控制則是如何遍歷這個(gè) elements 數(shù)組,可進(jìn)一步細(xì)分為控制邏輯(順序遍歷)和控制狀態(tài)(當(dāng)前遍歷到哪個(gè)元素)。下面將按照這個(gè)邏輯介紹不同語(yǔ)言中如何實(shí)現(xiàn)和模擬這些邏輯。
以 Ruby 語(yǔ)言(語(yǔ)法類似 Python)介紹了 Iterator 機(jī)制是如何簡(jiǎn)化遍歷操作的代碼。實(shí)際上中心思想就是將行為與控制分離,由語(yǔ)言層面的支持來(lái)降低控制代碼的薄記工作。
- deftextfiles(dir)
- Dir.chdir(dir)
- Dir["*"].eachdo|entry|
- yielddir+"\"+entryif/^.*.txt$/=~entry
- ifFileTest.directory?(entry)
- textfiles(entry){|file|yielddir+"\"+file}
- end
- end
- Dir.chdir("..")
- end
- textfiles(“c:\”){|file|
- putsfile
- }
例如上面這段 Ruby 的遞歸目錄處理代碼中,就采用了與 C# 2.0 中完全類似的語(yǔ)法實(shí)現(xiàn)協(xié)同執(zhí)行支持。
對(duì) C# 1.0 和 C++ 這類不支持協(xié)同執(zhí)行的語(yǔ)言,協(xié)同執(zhí)行過(guò)程中的狀態(tài)遷移或者說(shuō)執(zhí)行緒的調(diào)度工作,需要由庫(kù)和使用者自行實(shí)現(xiàn),例如 STL 中的迭代器 (iterator) 自身必須保存了與遍歷容器相關(guān)的位置信息。例如在 STL 中實(shí)現(xiàn)協(xié)同執(zhí)行:
- #include
- #include
- #include
- //ThefunctionobjectmultipliesanelementbyaFactor
- template
- classMultValue
- {
- private:
- TypeFactor;//Thevaluetomultiplyby
- public:
- //Constructorinitializesthevaluetomultiplyby
- MultValue(constType&_Val):Factor(_Val){
- }
- //Thefunctioncallfortheelementtobemultiplied
- voidoperator()(Type&elem)const
- {
- elem*=Factor;
- }
- };
- intmain()
- {
- usingnamespacestd;
- vector
v1; - //
- //Usingfor_eachtomultiplyeachelementbyaFactor
- for_each(v1.begin(),v1.end(),MultValue
(-2)); - }
雖然 STL 較為成功的通過(guò)迭代器、算法和謂詞,將此協(xié)同執(zhí)行邏輯中的行為和控制分離,謂詞表現(xiàn)行為(MultValue
【編輯推薦】
- 分析C#不安全代碼
- 淺析C#調(diào)用ImageAnimator
- C#連接Access、SQL Server數(shù)據(jù)庫(kù)
- 淺談C#固定的和活動(dòng)的變量
- 介紹C#中的值類型
分享標(biāo)題:概述C#代碼協(xié)同執(zhí)行
文章轉(zhuǎn)載:http://m.fisionsoft.com.cn/article/djiidgp.html


咨詢
建站咨詢
