经常在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的限制,我们就通过迭代器的方法来作为线程体,然后每个线程一个对象,每个对象里包含一个迭代器对象,然后在一个大循环里来调用。代码如下:

利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  1利用迭代器在.NET中实现“超轻量级线程”using System;
  2利用迭代器在.NET中实现“超轻量级线程”using System.Collections;
  3利用迭代器在.NET中实现“超轻量级线程”using System.Collections.Generic;
  4利用迭代器在.NET中实现“超轻量级线程”
  5利用迭代器在.NET中实现“超轻量级线程”public class MyClass
  6利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”{
  7利用迭代器在.NET中实现“超轻量级线程”    public static void RunSnippet()
  8利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    利用迭代器在.NET中实现“超轻量级线程”{
  9利用迭代器在.NET中实现“超轻量级线程”        ThreadLite tl=new ThreadLite();
 10利用迭代器在.NET中实现“超轻量级线程”        tl.AddActor(T1);
 11利用迭代器在.NET中实现“超轻量级线程”        tl.AddActor(T1);
 12利用迭代器在.NET中实现“超轻量级线程”        tl.Run();
 13利用迭代器在.NET中实现“超轻量级线程”        
 14利用迭代器在.NET中实现“超轻量级线程”    }

 15利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    public static IEnumerable T1(int id)利用迭代器在.NET中实现“超轻量级线程”{
 16利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        for(int i=0;i<10;i++)利用迭代器在.NET中实现“超轻量级线程”{
 17利用迭代器在.NET中实现“超轻量级线程”            Console.WriteLine("Thread "+id+" print "+i);
 18利用迭代器在.NET中实现“超轻量级线程”            yield return id;
 19利用迭代器在.NET中实现“超轻量级线程”        }

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

 21利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    public static IEnumerable T2(int id)利用迭代器在.NET中实现“超轻量级线程”{
 22利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        for(int i=0;i<8;i++)利用迭代器在.NET中实现“超轻量级线程”{
 23利用迭代器在.NET中实现“超轻量级线程”            Console.WriteLine("Thread "+id+" print "+i);
 24利用迭代器在.NET中实现“超轻量级线程”            yield return id;
 25利用迭代器在.NET中实现“超轻量级线程”        }

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

 27利用迭代器在.NET中实现“超轻量级线程”    
 28利用迭代器在.NET中实现“超轻量级线程”    
 29利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    Helper methods#region Helper methods
 30利用迭代器在.NET中实现“超轻量级线程”    
 31利用迭代器在.NET中实现“超轻量级线程”    public static void Main()
 32利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    利用迭代器在.NET中实现“超轻量级线程”{
 33利用迭代器在.NET中实现“超轻量级线程”        try
 34利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        利用迭代器在.NET中实现“超轻量级线程”{
 35利用迭代器在.NET中实现“超轻量级线程”            RunSnippet();
 36利用迭代器在.NET中实现“超轻量级线程”        }

 37利用迭代器在.NET中实现“超轻量级线程”        catch (Exception e)
 38利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        利用迭代器在.NET中实现“超轻量级线程”{
 39利用迭代器在.NET中实现“超轻量级线程”            string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
 40利用迭代器在.NET中实现“超轻量级线程”            Console.WriteLine(error);
 41利用迭代器在.NET中实现“超轻量级线程”        }

 42利用迭代器在.NET中实现“超轻量级线程”        finally
 43利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        利用迭代器在.NET中实现“超轻量级线程”{
 44利用迭代器在.NET中实现“超轻量级线程”            Console.Write("Press any key to continue利用迭代器在.NET中实现“超轻量级线程”");
 45利用迭代器在.NET中实现“超轻量级线程”            Console.ReadKey();
 46利用迭代器在.NET中实现“超轻量级线程”        }

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

 48利用迭代器在.NET中实现“超轻量级线程”
 49利用迭代器在.NET中实现“超轻量级线程”    private static void WL(object text, params object[] args)
 50利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    利用迭代器在.NET中实现“超轻量级线程”{
 51利用迭代器在.NET中实现“超轻量级线程”        Console.WriteLine(text.ToString(), args);    
 52利用迭代器在.NET中实现“超轻量级线程”    }

 53利用迭代器在.NET中实现“超轻量级线程”    
 54利用迭代器在.NET中实现“超轻量级线程”    private static void RL()
 55利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    利用迭代器在.NET中实现“超轻量级线程”{
 56利用迭代器在.NET中实现“超轻量级线程”        Console.ReadLine();    
 57利用迭代器在.NET中实现“超轻量级线程”    }

 58利用迭代器在.NET中实现“超轻量级线程”    
 59利用迭代器在.NET中实现“超轻量级线程”    private static void Break() 
 60利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    利用迭代器在.NET中实现“超轻量级线程”{
 61利用迭代器在.NET中实现“超轻量级线程”        System.Diagnostics.Debugger.Break();
 62利用迭代器在.NET中实现“超轻量级线程”    }

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

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

 66利用迭代器在.NET中实现“超轻量级线程”
 67利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”class ThreadLite利用迭代器在.NET中实现“超轻量级线程”{
 68利用迭代器在.NET中实现“超轻量级线程”    int currentid = 1;
 69利用迭代器在.NET中实现“超轻量级线程”    public delegate IEnumerable ActorHandler(int id);
 70利用迭代器在.NET中实现“超轻量级线程”    private List<IEnumerator> ActionList;
 71利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    public ThreadLite()利用迭代器在.NET中实现“超轻量级线程”{
 72利用迭代器在.NET中实现“超轻量级线程”        ActionList=new List<IEnumerator>();
 73利用迭代器在.NET中实现“超轻量级线程”    }

 74利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    public void AddActor(ActorHandler actor)利用迭代器在.NET中实现“超轻量级线程”{
 75利用迭代器在.NET中实现“超轻量级线程”        Actor act=new Actor(actor);
 76利用迭代器在.NET中实现“超轻量级线程”        act.ID=this.currentid;
 77利用迭代器在.NET中实现“超轻量级线程”        ActionList.Add(act.GetEnumerator());
 78利用迭代器在.NET中实现“超轻量级线程”        this.currentid++;
 79利用迭代器在.NET中实现“超轻量级线程”    }

 80利用迭代器在.NET中实现“超轻量级线程”    
 81利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    public void Run()利用迭代器在.NET中实现“超轻量级线程”{
 82利用迭代器在.NET中实现“超轻量级线程”        int fc = 0;
 83利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        while(true)利用迭代器在.NET中实现“超轻量级线程”{
 84利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”            foreach(IEnumerator ie in ActionList)利用迭代器在.NET中实现“超轻量级线程”{
 85利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”                if(!ie.MoveNext())利用迭代器在.NET中实现“超轻量级线程”{
 86利用迭代器在.NET中实现“超轻量级线程”                    fc++;
 87利用迭代器在.NET中实现“超轻量级线程”                }

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

 89利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”            if(fc==ActionList.Count)利用迭代器在.NET中实现“超轻量级线程”{
 90利用迭代器在.NET中实现“超轻量级线程”                break;
 91利用迭代器在.NET中实现“超轻量级线程”            }

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

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

 95利用迭代器在.NET中实现“超轻量级线程”    
 96利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”    class Actor利用迭代器在.NET中实现“超轻量级线程”{
 97利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        public int ID利用迭代器在.NET中实现“超轻量级线程”{
 98利用迭代器在.NET中实现“超轻量级线程”            get;
 99利用迭代器在.NET中实现“超轻量级线程”            set;
100利用迭代器在.NET中实现“超轻量级线程”        }

101利用迭代器在.NET中实现“超轻量级线程”
102利用迭代器在.NET中实现“超轻量级线程”        ThreadLite.ActorHandler hdl;
103利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        public Actor(ThreadLite.ActorHandler handler)利用迭代器在.NET中实现“超轻量级线程”{
104利用迭代器在.NET中实现“超轻量级线程”            hdl=handler;
105利用迭代器在.NET中实现“超轻量级线程”        }

106利用迭代器在.NET中实现“超轻量级线程”利用迭代器在.NET中实现“超轻量级线程”        public IEnumerator GetEnumerator()利用迭代器在.NET中实现“超轻量级线程”{
107利用迭代器在.NET中实现“超轻量级线程”            IEnumerable ieb = hdl(ID);
108利用迭代器在.NET中实现“超轻量级线程”            return ieb.GetEnumerator();
109利用迭代器在.NET中实现“超轻量级线程”        }

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

111利用迭代器在.NET中实现“超轻量级线程”    
112利用迭代器在.NET中实现“超轻量级线程”}
执行结果如下:
利用迭代器在.NET中实现“超轻量级线程”

相关文章:

  • 2021-04-30
  • 2022-12-23
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-04
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-07-23
  • 2021-11-17
  • 2021-07-24
  • 2022-12-23
相关资源
相似解决方案