`

利用迭代器在.NET中实现“超轻量级线程”

阅读更多

经常在python,lua之类的脚本语言看到 超轻量级线程的概念,动辄上百万的线程,硕大的线程数量非常的养眼,今天突发奇想,在c#下也来弄个超轻量线程的实现,虽然很简陋,但是希望能和大家一起来讨论讨论。

且不说超轻量级的线程有用无用。其实现原理基本上都是在单线程中来模拟线程的切换,由于没有线程切换的开销,所以看着比系统线程要快。在python中一般通过yield关键字来实现。翻遍msdn发现c#也有yield return的关键字。yield return 用于实现迭代器。什么是迭代器呢,这是.NET2.0所带来的特征,如果不清楚请参见

http://msdn.microsoft.com/zh-cn/library/dscyy5s0(VS.80).aspx

其大意是:

yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。

这段对我们将要实现的功能尤其重要,其实一言盖之,yield可以把一个方法分成几段来执行。但是在C#里有限制,在调用yield的方法的返回值必须是IEnumerable,其实说白了,其实是编译器自动把这段方法转换成了一个迭代器的对象,这样一段调用其实也就是在编译的时候就已经被分段了。根据msdn的原文描述就是:

迭代器是 C# 2.0 中的新功能。迭代器是方法、get 访问器或运算符,它使您能够在结构中支持 foreach 迭代,而不必实现整个 IEnumerable 接口。您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable<T> 接口的 Current、MoveNext 和 Dispose 方法。

要通过yield来模拟线程,我们必须有线程体,由于yield的限制,我们就通过迭代器的方法来作为线程体,然后每个线程一个对象,每个对象里包含一个迭代器对象,然后在一个大循环里来调用。代码如下:

Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  1using System;
  2using System.Collections;
  3using System.Collections.Generic;
  4
  5public class MyClass
  6{
  7    public static void RunSnippet()
  8    {
  9        ThreadLite tl=new ThreadLite();
 10        tl.AddActor(T1);
 11        tl.AddActor(T1);
 12        tl.Run();
 13        
 14    }

 15    public static IEnumerable T1(int id){
 16        for(int i=0;i<10;i++){
 17            Console.WriteLine("Thread "+id+" print "+i);
 18            yield return id;
 19        }

 20    }

 21    public static IEnumerable T2(int id){
 22        for(int i=0;i<8;i++){
 23            Console.WriteLine("Thread "+id+" print "+i);
 24            yield return id;
 25        }

 26    }

 27    
 28    
 29    Helper methods#region Helper methods
 30    
 31    public static void Main()
 32    {
 33        try
 34        {
 35            RunSnippet();
 36        }

 37        catch (Exception e)
 38        {
 39            string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
 40            Console.WriteLine(error);
 41        }

 42        finally
 43        {
 44            Console.Write("Press any key to continue");
 45            Console.ReadKey();
 46        }

 47    }

 48
 49    private static void WL(object text, params object[] args)
 50    {
 51        Console.WriteLine(text.ToString(), args);    
 52    }

 53    
 54    private static void RL()
 55    {
 56        Console.ReadLine();    
 57    }

 58    
 59    private static void Break() 
 60    {
 61        System.Diagnostics.Debugger.Break();
 62    }

 63
 64    #endregion

 65}

 66
 67class ThreadLite{
 68    int currentid = 1;
 69    public delegate IEnumerable ActorHandler(int id);
 70    private List<IEnumerator> ActionList;
 71    public ThreadLite(){
 72        ActionList=new List<IEnumerator>();
 73    }

 74    public void AddActor(ActorHandler actor){
 75        Actor act=new Actor(actor);
 76        act.ID=this.currentid;
 77        ActionList.Add(act.GetEnumerator());
 78        this.currentid++;
 79    }

 80    
 81    public void Run(){
 82        int fc = 0;
 83        while(true){
 84            foreach(IEnumerator ie in ActionList){
 85                if(!ie.MoveNext()){
 86                    fc++;
 87                }

 88            }

 89            if(fc==ActionList.Count){
 90                break;
 91            }

 92        }

 93        
 94    }

 95    
 96    class Actor{
 97        public int ID{
 98            get;
 99            set;
100        }

101
102        ThreadLite.ActorHandler hdl;
103        public Actor(ThreadLite.ActorHandler handler){
104            hdl=handler;
105        }

106        public IEnumerator GetEnumerator(){
107            IEnumerable ieb = hdl(ID);
108            return ieb.GetEnumerator();
109        }

110    }

111    
112}
执行结果如下:
分享到:
评论

相关推荐

    Asp.net 进度条封装(多线程)控件+示例

    在Asp.net中,多线程是指在一个应用程序中同时运行多个独立的任务或操作。通过使用多线程,我们可以将耗时的操作与用户界面(UI)分离开来,从而保持UI的响应性。对于进度条控件,主线程负责更新UI,而其他线程则...

    .NET Parallel 并行计算 多线程,高并发

    .NET Framework 4 引入了一组强大的并行计算工具,称为`.NET Parallel`,它使得开发者可以轻松地利用多核处理器的优势,实现高效的多线程和高并发编程。这一技术的引入大大提升了应用程序的性能,特别是在处理大数据...

    .net web实现活动转盘功能

    在.NET Web开发中,活动转盘功能是一种常见的交互式组件,通常用于抽奖、优惠活动或者游戏等场景。本文将深入探讨如何使用.NET技术栈来实现这样一个功能。 首先,我们需要了解.NET Web开发的基本架构。通常,这涉及...

    动软.Net代码生成器

    在实际应用中,动软.Net代码生成器支持多种数据库,如SQL Server、Oracle、MySQL等,可以自动生成与数据库交互的ADO.NET代码,包括连接字符串、SQL语句、数据填充等。同时,它还能够根据数据库表结构生成对应的实体...

    android 异步任务 Binder 线程间交互 Handler 迭代器模式

    在Android应用开发中,结合这些技术,我们可以高效地实现线程交互,确保UI的流畅性,同时利用迭代器模式优化数据处理。例如,当需要从网络获取数据并在UI上显示时,可以使用AsyncTask在后台下载数据,通过Handler将...

    迭代器方法任意控制.rar_thread_迭代器綫程使用

    在这个“迭代器方法任意控制.rar_thread_迭代器綫程使用”的资源中,我们可以学习如何在多线程环境中利用迭代器进行操作,这对于理解和提升Java并发编程技能来说是非常有价值的。 首先,我们要理解迭代器的基本概念...

    用C#(ADO.NET)实现的一个简单的图书管理系统.zip

    在这个项目中,开发者需要掌握类、对象、继承、多态等概念,以及如何利用C#进行控制流程、异常处理、文件操作等基本编程技能。 2. ADO.NET数据库交互:ADO.NET是.NET Framework中用于访问数据库的组件,它提供了...

    sqlite+.net4.0

    同时,如果应用程序需要在多线程环境中运行,需要了解SQLite.NET版本是否支持线程安全操作,因为某些版本可能需要手动配置。 另外,当处理大量数据时,注意避免内存溢出。可以使用数据流或分批处理技术,减少一次性...

    VB.NET实现IEnumerator接口

    经常会用到有类似父子关系的这个对象,比如在我现在的一个项目中,有订单对象,在一个订单下又包含多个产品,这时我就想用 Iterator模式来封装订单下的产品,在dot Net中的IEnumerator接口就是用来实现迭代的,...

    ExtJS+ASP.NET实现真实的进度条显示

    在ASP.NET中,我们可以通过使用HttpContext.Current.Cache对象来存储进度信息。例如,代码片段5至35展示了如何在ExecuteTimeConsumingTask()方法中执行一个循环操作,并在每次迭代时将进度更新到缓存中。通过...

    迭代器方法優先權控制.rar_迭代器方法優先權控制

    在Java中,我们可以实现自定义迭代器类,扩展`Iterator`接口并覆盖其方法来实现我们的优先级控制。例如,我们可能需要一个优先处理最新数据的迭代器,那么在`next()`方法中,我们将选择具有最大时间戳的元素返回。...

    FFT VB.NET

    在VB.NET中实现FFT,可以帮助开发者处理音频、图像和其他时间序列数据,进行频域分析、滤波、解调等多种任务。 在VB.NET中实现FFT,主要涉及以下知识点: 1. **离散傅立叶变换(DFT)**:DFT是将一个离散时间信号...

    C#ASP .NET数据库应用程序实现增删改查(web)

    在C# ASP.NET中,这可以通过创建一个新的SqlCommand对象,设置其CommandType为Text,然后将SQL INSERT语句作为CommandText属性的值。执行SqlCommand的ExecuteNonQuery方法即可完成插入。 改(Update)操作更新现有...

    ASP.NET生成二维码微信扫一扫

    在ASP.NET中,我们可以使用开源库如ZXing.Net(前身为Google的Zxing,也称为Zebra Crossing),这个库提供了读取和生成多种条形码和二维码的能力,包括QR码。 要实现C#代码生成二维码,首先需要将ZXing.Net库引入...

    应用框架的设计与实现:.NET平台.pdf

    7. 实现应用框架:在.NET平台中实现框架涉及编写代码、构建项目、进行单元测试和集成测试、以及优化性能和可维护性。 8. 应用框架的测试与部署:在框架开发完成后,需要进行彻底的测试来确保其稳定性和性能。部署时...

    c++容器无关迭代器

    用来正向或者逆向迭代各种stl兼容的容器和标准数组的迭代器; 方便实现部分容器无关代码; 面向对象风格迭代器 原帖: http://blog.csdn.net/CDScan/archive/2010/04/01/5441640.aspx

    .net c# 代码生成器 源码加工具

    《.NET C# 代码生成器与源码加工具详解》 在软件开发过程中,代码生成器是一种极其有用的工具,它能够自动生成大量的基础代码...在如今快速迭代的开发环境中,掌握并合理利用代码生成器,无疑是提升开发生产力的关键。

    汉诺塔 vb.net

    在vb.net环境下实现汉诺塔游戏,我们可以利用递归算法来解决这个问题。 首先,我们需要理解vb.net的基本语法和面向对象编程的概念。VB.NET是Microsoft开发的一种现代、类型安全的编程语言,它基于.NET Framework或...

    .net代码生成器,C#代码

    《.NET代码生成器与C#编程实践》 在软件开发过程中,代码生成器是一种能够自动化创建源代码的工具,显著...在实际项目中合理利用代码生成器,将极大提升开发效率,优化代码质量,从而更好地实现项目的快速迭代和维护。

    Foundations Visual C++.Net

    本书名为《Foundations Visual C++.Net》,由Gordon Hogenson撰写,主要面向.NET平台的读者,特别是希望深入了解C++/CLI和WinForm在.netPlatform中的应用的开发者。这本书从基础知识讲起,一直覆盖到实际操作,是...

Global site tag (gtag.js) - Google Analytics