日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
概述C#代碼協(xié)同執(zhí)行

C#代碼協(xié)同執(zhí)行的支持機制

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于成都網站建設、成都做網站、鳳岡網絡推廣、微信小程序開發(fā)、鳳岡網絡營銷、鳳岡企業(yè)策劃、鳳岡品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供鳳岡建站搭建服務,24小時服務熱線:13518219792,官方網址:www.cdcxhl.com

幾個月前我曾大致分析過 C# 2.0 中 iterator block 機制的實現原理,《C# 2.0 中Iterators的改進與實現原理淺析》,文中簡要介紹了 C# 2.0 是如何在不修改 CLR 的前提下由編譯器,通過有限狀態(tài)機來實現 iterator block 中 yield 關鍵字。實際上,這一機制的最終目的是提供一個C#代碼協(xié)同執(zhí)行的支持機制。

 
 
 
  1. using System.Collections.Generic;  
  2.  
  3. public class Tokens : IEnumerable 
  4. {  
  5. public IEnumerator GetEnumerator()  
  6. {  
  7. for(int i = 0; i; i++)  
  8. yield elements[i];  
  9. }  
  10.  
  11. }  
  12.  
  13. foreach (string item in new Tokens())  
  14. {  
  15. Console.WriteLine(item);  
  16. }  

在這段代碼執(zhí)行過程中,foreach 的循環(huán)體和 GetEnumerator 函數體實際上是在同一個線程中交替執(zhí)行的。這是一種介于線程和順序執(zhí)行之間的協(xié)同執(zhí)行模式,之所以稱之為協(xié)同(Coroutine),是因為同時執(zhí)行的多個代碼塊之間的調度是由邏輯隱式協(xié)同完成的。順序執(zhí)行無所謂并行性,而線程往往是由系統(tǒng)調度程序強制性搶先切換,相對來說Win3.x 中的獨占式多任務倒是與協(xié)同模型比較類似。
就協(xié)同執(zhí)行而言,從功能上可以分為行為、控制兩部分,控制又可進一步細分為控制邏輯和控制狀態(tài)。行為對應著如何處理目標對象,如上述代碼中:行為就是將目標對象打印到控制臺;控制則是如何遍歷這個 elements 數組,可進一步細分為控制邏輯(順序遍歷)和控制狀態(tài)(當前遍歷到哪個元素)。下面將按照這個邏輯介紹不同語言中如何實現和模擬這些邏輯。

以 Ruby 語言(語法類似 Python)介紹了 Iterator 機制是如何簡化遍歷操作的代碼。實際上中心思想就是將行為與控制分離,由語言層面的支持來降低控制代碼的薄記工作。

 
 
 
  1. deftextfiles(dir)  
  2. Dir.chdir(dir)  
  3.  
  4. Dir["*"].eachdo|entry|  
  5. yielddir+"\"+entryif/^.*.txt$/=~entry  
  6.  
  7. ifFileTest.directory?(entry)  
  8. textfiles(entry){|file|yielddir+"\"+file}  
  9. end  
  10. end  
  11. Dir.chdir("..")  
  12. end  
  13.  
  14. textfiles(“c:\”){|file|  
  15. putsfile  

例如上面這段 Ruby 的遞歸目錄處理代碼中,就采用了與 C# 2.0 中完全類似的語法實現協(xié)同執(zhí)行支持。

對 C# 1.0 和 C++ 這類不支持協(xié)同執(zhí)行的語言,協(xié)同執(zhí)行過程中的狀態(tài)遷移或者說執(zhí)行緒的調度工作,需要由庫和使用者自行實現,例如 STL 中的迭代器 (iterator) 自身必須保存了與遍歷容器相關的位置信息。例如在 STL 中實現協(xié)同執(zhí)行:

 
 
 
  1. #include 
  2. #include 
  3. #include 
  4.  
  5. //ThefunctionobjectmultipliesanelementbyaFactor  
  6. template 
  7. classMultValue  
  8. {  
  9. private:  
  10. TypeFactor;//Thevaluetomultiplyby  
  11. public:  
  12. //Constructorinitializesthevaluetomultiplyby  
  13. MultValue(constType&_Val):Factor(_Val){  
  14. }  
  15.  
  16. //Thefunctioncallfortheelementtobemultiplied  
  17. voidoperator()(Type&elem)const  
  18. {  
  19. elem*=Factor;  
  20. }  
  21. };  
  22.  
  23. intmain()  
  24. {  
  25. usingnamespacestd;  
  26.  
  27. vectorv1;  
  28.  
  29. //  
  30.  
  31. //Usingfor_eachtomultiplyeachelementbyaFactor  
  32. for_each(v1.begin(),v1.end(),MultValue(-2));  

雖然 STL 較為成功的通過迭代器、算法和謂詞,將此協(xié)同執(zhí)行邏輯中的行為和控制分離,謂詞表現行為(MultValue、迭代器(v1.being(), v1.end())表現控制狀態(tài)、算法表現控制邏輯(for_each),但仍然存在編寫復雜,使用麻煩,并且語義不連冠的問題。以上介紹C#代碼協(xié)同執(zhí)行的支持機制。

【編輯推薦】

  1. 分析C#不安全代碼
  2. 淺析C#調用ImageAnimator
  3. C#連接Access、SQL Server數據庫
  4. 淺談C#固定的和活動的變量
  5. 介紹C#中的值類型

當前題目:概述C#代碼協(xié)同執(zhí)行
文章來源:http://www.5511xx.com/article/djiidgp.html