用《捕鱼达人》去理解c#中的多线程

用《捕鱼达人》去理解c#中的多线程

ID:32432162

大小:71.50 KB

页数:6页

时间:2019-02-04

用《捕鱼达人》去理解c#中的多线程_第1页
用《捕鱼达人》去理解c#中的多线程_第2页
用《捕鱼达人》去理解c#中的多线程_第3页
用《捕鱼达人》去理解c#中的多线程_第4页
用《捕鱼达人》去理解c#中的多线程_第5页
资源描述:

《用《捕鱼达人》去理解c#中的多线程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、线程是进程中某个单一顺序的控制流,是程序运行中的调度单位,是程序执行流的最小单位,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序进程本身。CLR中有三种常用创建和管理线程的方式:Thread、ThreadPool、Task,下面用最简单的例子写出自己对这三种方式的理解:一、Thread《捕鱼达

2、人》是大家都玩过的游戏,至于游戏怎么设计我也不太清楚,但我想在这里用自己对线程的理解来用线程描述这个游戏。假如屏幕上随机产生两条鱼,并且游来游去,代码如下:1classFish2{3publicstringName{get;set;}45publicFish()6{7Name="小黄鱼";8}910publicvoidMove()11{12Console.WriteLine(string.Format("{0}在游来游去......",Name));13}14}1516classProgram17{18staticvoidMai

3、n(string[]args)19{20Fishfish=newFish();21Threadt1=newThread(()=>22{23fish.Move();24});25t1.IsBackground=true;26t1.Start();2728Fishfish2=newFish(){Name="大鲨鱼"};29Threadt2=newThread(()=>30{31fish2.Move();32});33t2.IsBackground=true;www.ipb.cc34t2.Start();3536Console.Rea

4、dKey();37}38}运行后屏幕如下:小黄鱼在游来游去......大鲨鱼在游来游去...... 二、ThreadPool如果鱼潮来临,一下子要产生100条鱼,如果按上面Thread的做法就要开启100条线程,这样对系统资源的损耗太大,这时我们可以用ThreadPool线程池来实现,代码如下:1staticvoidMain(string[]args)2{3Fishfish=newFish();4Fishfish2=newFish(){Name="大鲨鱼"};5Fishfish3=newFish(){Name="灯笼鱼"};6F

5、ishfish4=newFish(){Name="红鲤鱼"};7Fishfish100=newFish(){Name="灯笼鱼"};8ThreadPool.QueueUserWorkItem(f=>{fish.Move();});9ThreadPool.QueueUserWorkItem(f=>{fish2.Move();});10ThreadPool.QueueUserWorkItem(f=>{fish3.Move();});11ThreadPool.QueueUserWorkItem(f=>{fish4.Move();});

6、12ThreadPool.QueueUserWorkItem(f=>{fish100.Move();});13Console.ReadKey();14}运行后屏幕如下:灯笼鱼在游来游去......大鲨鱼在游来游去......灯笼鱼在游来游去......小黄鱼在游来游去......红鲤鱼在游来游去......由于多线程是并发执行,由系统分配顺序,所以上面的结果是随机的 三、TaskTask是.Net4.0中新加的功能,由于ThreadPool对池中的线程不好控制,Task用来弥补,比如在鱼在流动的时候,我开了一个枪和炮的线程用来发

7、射子弹捕鱼,鱼中枪后鱼游动的线程就要结束,结束的时候弹出奖励积分,比如小黄鱼弹出1分,大鲨鱼弹出100分,这是就要用到Task对象的ContinueWith方法,该方法可以在线程结束的时候产生一个回调方法,代码如下: 1   classProgram2{3staticvoidMain(string[]args)4{5//用来取消小黄鱼线程6CancellationTokenSourcects=newCancellationTokenSource();78Fishfish=newFish();www.qqtop2.com9Fish

8、fish2=newFish(){Name="大鲨鱼",Score=100};1011Taskt1=newTask(()=>fish.Move(cts.Token),cts.Token);12t1.Start();13//小黄鱼被击中后显示积分14t1.Conti

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。