溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#代碼協(xié)同執(zhí)行是怎么實(shí)現(xiàn)的

發(fā)布時(shí)間:2021-12-02 13:37:54 來(lái)源:億速云 閱讀:115 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“C#代碼協(xié)同執(zhí)行是怎么實(shí)現(xiàn)的”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C#代碼協(xié)同執(zhí)行是怎么實(shí)現(xiàn)的”吧!

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

實(shí)際上,這一機(jī)制的最終目的是提供一個(gè)C#代碼協(xié)同執(zhí)行的支持機(jī)制。

using System.Collections.Generic;   public class Tokens : IEnumerable<string> {  public IEnumerator<string> GetEnumerator()  {  for(int i = 0; i<elements.Length; 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<vector> #include<algorithm> #include<iostream>  //ThefunctionobjectmultipliesanelementbyaFactor  template<classType> classMultValue  {  private:  TypeFactor;//Thevaluetomultiplyby  public:  //Constructorinitializesthevaluetomultiplyby  MultValue(constType&_Val):Factor(_Val){  }   //Thefunctioncallfortheelementtobemultiplied  voidoperator()(Type&elem)const  {  elem*=Factor;  }  };   intmain()  {  usingnamespacestd;   vector<int>v1;   //   //Usingfor_eachtomultiplyeachelementbyaFactor  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),但仍然存在編寫(xiě)復(fù)雜,使用麻煩,并且語(yǔ)義不連冠的問(wèn)題。

到此,相信大家對(duì)“C#代碼協(xié)同執(zhí)行是怎么實(shí)現(xiàn)的”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI