温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#代码协同执行是怎么实现的

发布时间:2021-12-02 13:37:54 来源:亿速云 阅读:119 作者:iii 栏目:编程语言

本篇内容主要讲解“C#代码协同执行是怎么实现的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#代码协同执行是怎么实现的”吧!

C#代码协同执行的支持机制

实际上,这一机制的最终目的是提供一个C#代码协同执行的支持机制。

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);  }

在这段代码执行过程中,foreach 的循环体和 GetEnumerator 函数体实际上是在同一个线程中交替执行的。这是一种介于线程和顺序执行之间的协同执行模式,之所以称之为协同(Coroutine),是因为同时执行的多个代码块之间的调度是由逻辑隐式协同完成的。顺序执行无所谓并行性,而线程往往是由系统调度程序强制性抢先切换,相对来说Win3.x 中的独占式多任务倒是与协同模型比较类似。
就协同执行而言,从功能上可以分为行为、控制两部分,控制又可进一步细分为控制逻辑和控制状态。行为对应着如何处理目标对象,如上述代码中:行为就是将目标对象打印到控制台;控制则是如何遍历这个 elements 数组,可进一步细分为控制逻辑(顺序遍历)和控制状态(当前遍历到哪个元素)。下面将按照这个逻辑介绍不同语言中如何实现和模拟这些逻辑。

以 Ruby 语言(语法类似 Python)介绍了 Iterator 机制是如何简化遍历操作的代码。实际上中心思想就是将行为与控制分离,由语言层面的支持来降低控制代码的薄记工作。

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 中完全类似的语法实现协同执行支持。

对 C# 1.0 和 C++ 这类不支持协同执行的语言,协同执行过程中的状态迁移或者说执行绪的调度工作,需要由库和使用者自行实现,例如 STL 中的迭代器 (iterator) 自身必须保存了与遍历容器相关的位置信息。例如在 STL 中实现协同执行:

#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 较为成功的通过迭代器、算法和谓词,将此协同执行逻辑中的行为和控制分离,谓词表现行为(MultValue<int>、迭代器(v1.being(), v1.end())表现控制状态、算法表现控制逻辑(for_each),但仍然存在编写复杂,使用麻烦,并且语义不连冠的问题。

到此,相信大家对“C#代码协同执行是怎么实现的”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI