自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

概述C#代碼協(xié)同執(zhí)行

開發(fā) 后端
本文介紹C#代碼協(xié)同執(zhí)行,以及介紹foreach 的循環(huán)體和 GetEnumerator 函數(shù)體實(shí)際上是在同一個(gè)線程中交替執(zhí)行的。

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

幾個(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ī)制。

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

在這段代碼執(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)降低控制代碼的薄記工作。

  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 中完全類似的語(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í)行:

  1. #include<vector> 
  2. #include<algorithm> 
  3. #include<iostream> 
  4.  
  5. //ThefunctionobjectmultipliesanelementbyaFactor  
  6. template<classType> 
  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. vector<int>v1;  
  28.  
  29. //  
  30.  
  31. //Usingfor_eachtomultiplyeachelementbyaFactor  
  32. for_each(v1.begin(),v1.end(),MultValue<int>(-2));  

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

【編輯推薦】

  1. 分析C#不安全代碼
  2. 淺析C#調(diào)用ImageAnimator
  3. C#連接Access、SQL Server數(shù)據(jù)庫(kù)
  4. 淺談C#固定的和活動(dòng)的變量
  5. 介紹C#中的值類型
責(zé)任編輯:佚名 來(lái)源: 博客園
相關(guān)推薦

2009-08-17 10:54:53

C#執(zhí)行ping命令

2009-08-14 16:54:19

C# Hello Wo

2009-08-25 12:50:32

數(shù)據(jù)庫(kù)常用C#代碼

2009-08-06 16:30:58

C#代碼和驗(yàn)證碼圖片

2009-08-25 10:08:39

C# MyData對(duì)象

2009-08-19 11:09:00

C# Cast<T>

2009-08-24 18:09:13

C#構(gòu)造函數(shù)

2009-08-20 16:28:45

C#匿名方法

2009-08-25 16:49:44

C#使用if語(yǔ)句

2009-09-03 10:42:16

C# Employee

2009-08-17 09:57:00

C# Windows

2009-08-18 17:29:02

C#使用指針

2009-08-18 09:26:07

C#線程功能

2009-08-13 15:18:23

C#文件上傳

2009-08-31 09:44:23

C# Employee

2009-07-31 14:08:54

C# 匿名函數(shù)

2009-09-03 11:15:38

C#設(shè)置Coopera

2009-09-02 16:02:52

C#引用托管對(duì)象

2009-08-19 15:30:40

C#復(fù)合控件構(gòu)建

2009-08-21 17:11:41

C#調(diào)用Active組
點(diǎn)贊
收藏

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