仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1275|回复: 9
打印 上一主题 下一主题

[学习教程] ASP.NET编程:.Net下的多线程编程

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:24:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。多线程是良多把握系统所具有的特征,它能年夜年夜提拔程序的运转效力,因而多线程编程武艺为编程者广泛关心。长远微软的.Net计谋正进一步促进,各类干系的武艺正为昌大编程者所回收,一样在.Net中多线程编程武艺具有...多线程是良多把握系统所具有的特征,它能年夜年夜提拔程序的运转效力,因而多线程编程武艺为编程者广泛关心。长远微软的.Net计谋正进一步促进,各类干系的武艺正为昌大编程者所回收,一样在.Net中多线程编程武艺具有相当主要的位置。本文我就向公共先容在.Net下举行多线程编程的基础举措和程序。入手下手新线程在.Net下建立一个新线程是非常容易的,你能够经由过程以下的语句来入手下手一个新的线程:Threadthread=newThread(newThreadStart(ThreadFunc));thread.Start();起首条语句建立一个新的Thread工具,并指了然一个该线程的举措。当新的线程入手下手时,该举措也就被挪用实行了。该线程工具经由过程一个System..Threading.ThreadStart类的一个实例以范例安全的举措来挪用它要挪用的线程举措。其次条语句正式入手下手该新线程,一旦举措Start()被挪用,该线程就保持在一个"alive"的形态下了,你能够经由过程读取它的IsAlive属性来判断它是不是处于"alive"形态。上面的语句显现了假设一个线程处于"alive"形态下就将该线程挂起的举措:if(thread.IsAlive){thread.Suspend();}不外请注意,线程工具的Start()举措只是启动了该线程,而其实不包管其线程举措ThreadFunc()能立即失掉实行。它只是包管该线程工具能被分拨到CPU工夫,而实践的实行还要由把握系统根据打点器工夫来决计。一个线程的举措不蕴涵任何参数,同时也不前往任何值。它的定名礼貌和一样平常函数的定名礼貌不异。它既能够是静态的(static)也能够是非静态的(nonstatic)。当它实行结束后,响应的线程也就停止了,其线程工具的IsAlive属性也就被置为false了。上面是一个线程举措的实例:publicstaticvoidThreadFunc(){for(inti=0;i%26lt;10;i++){Console.WriteLine("ThreadFunc{0}"i);}}前台线程和背景线程.Net的公用言语运转时(CommonLanguageRuntime,CLR)能分别两种差别范例的线程:前台线程和背景线程。这二者的分辨便是:使用程序必须运转统统面的前台线程才能够加入;而关于背景线程,使用程序则能够不思索其是不是已运转结束而间接加入,周全的背景线程在使用程序加入时都会主动停止。一个线程是前台线程仍是背景线程可由它的IsBackground属性来决计。这个属性是可读又可写的。它的默许值为false,即意味着一个线程默以为前台线程。我们能够将它的IsBackground属性设置为true,从而使之成为一个背景线程。上面的例子是一个无效羁系台程序,程序一入手下手便启动了10个线程,每一个线程运转5秒钟工夫。因为线程的IsBackground属性默以为false,即它们都是前台线程,因而只管程序的主线程很快就运转停止了,但程序要到周全已启动的线程都运转结束才会停止。示例代码以下:usingSystem;usingSystem.Threading;classMyApp{publicstaticvoidMain(){for(inti=0;i%26lt;10;i++){Threadthread=newThread(newThreadStart(ThreadFunc));thread.Start();}}privatestaticvoidThreadFunc(){DateTimestart=DateTime.Now;while((DateTime.Now-start).Seconds%26lt;5);}}接上去我们对下面的代码举行稍微修正,将每一个线程的IsBackground属性都设置为true,则每一个线程都是背景线程了。那末只需程序的主线程停止了,全部程序也就停止了。示例代码以下:usingSystem;usingSystem.Threading;classMyApp{publicstaticvoidMain(){for(inti=0;i%26lt;10;i++){Threadthread=newThread(newThreadStart(ThreadFunc));thread.IsBackground=true;thread.Start();}}privatestaticvoidThreadFunc(){DateTimestart=DateTime.Now;while((DateTime.Now-start).Seconds%26lt;5);}}既然前台线程和背景线程有这类不同,那末我们怎样晓得该如何设置一个线程的IsBackground属性呢?上面是一些基础的准绳:关于一些在背景运转的线程,当程序停止时这些线程没有需要不休运转了,那末这些线程就应该设置为背景线程。比方一个程序启动了一个举行多量运算的线程,但是只需程序一旦停止,谁人线程就丢失了不休存在的意义,那末谁人线程就该是作为背景线程的。而关于一些服务于用户界面的线程一再是要设置为前台线程的,由于即便程序的主线程停止了,其他的用户界面的线程极可能要不休存在来显现干系的信息,因而不克不及立即停止它们。这里我只是给出了一些准绳,具体到实践的使用一再必要
编程者的进一步当心商议。线程优先级一旦一个线程入手下手运转,线程调度程序就能够无效羁系其所取得的CPU工夫。假设一个托管的使用程序运转在Windows呆板上,则线程调度程序是由Windows所供应的。在其他的平台上,线程调度程序多是把握系统的一部分,也自然多是.Net框架的一部分。不外我们这里不用思索线程的调度程序是如何发生的,我们只需晓得经由过程设置线程的优先级我们就能够使该线程取得差别的CPU工夫。线程的优先级是由Thread.Priority属性无效羁系的,其值蕴涵:ThreadPriority.Highest、ThreadPriority.AboveNormal、ThreadPriority.Normal、ThreadPriority.BelowNormal和ThreadPriority.Lowest。从它们的称号上我们自然能够晓得它们的优先水平,因而这里就未几作先容了。线程的默许优先级为ThreadPriority.Normal。实际上,具有不异优先级的线程会取得不异的CPU工夫,不外在实践实行时,动静行列中的线程拦阻或是把握系统的优先级的提上等缘故原由会招致具有不异优先级的线程会取得差别的CPU工夫。不外从整体下去思索仍能够疏忽这类差别。你能够经由过程以下的举措来变化一个线程的优先级。thread.Priority=ThreadPriority.AboveNormal;或是:thread.Priority=ThreadPriority.BelowNormal;经由过程下面的起首句语句你能够提拔一个线程的优先级,那末该线程就会响应的取得更多的CPU工夫;经由过程其次句语句你便下降了谁人线程的优先级,因而它就会被分拨到比本来少的CPU工夫了。你能够在一个线程入手下手运转前或是在它的运转过程当中的任什么时候刻变化它的优先级。实际上你还能够恣意的设置每一个线程的优先级,不外一个优先级太高的线程一再会陶冶到其他线程的运转,乃至陶冶到其他程序的运转,因而最好不要随便的设置线程的优先级。挂起线程和重新入手下手线程Thread类不合供应了两个举措来挂起线程和重新入手下手线程,也便是Thread.Suspend能停息一个正在运转的线程,而Thread.Resume又能让谁人线程不休运转。不像Windows内核,.Net框架是不纪录线程的挂起次数的,因而不论你挂起线程过多次,只需一次挪用Thread.Resume就能够让挂起的线程重新入手下手运转。Thread类还供应了一个静态的Thread.Sleep举措,它能使一个线程主动的挂起一定的工夫,然后主动的重新入手下手。一个线程能在它自己外部挪用Thread.Sleep举措,也能在自己外部挪用Thread.Suspend举措,但是一定要别的线程来挪用它的Thread.Resume举措才能够重新入手下手。这一点是否是很容易想通的啊?上面的例子显现了如何使用Thread.Sleep举措:while(ContinueDrawing){DrawNextSlide();Thread.Sleep(5000);}停止线程在托管的代码中,你能够经由过程以下的语句在一个线程中将另外一个线程停止失落:thread.Abort();上面我们来讲授一下Abort()举措是如何事情的。由于公用言语运转时管理了周全的托管的线程,一样它能在每一个线程内抛出非常。Abort()举措能在偏向线程中抛出一个ThreadAbortException非常从而招致偏向线程的停止。不外Abort()举措被挪用后,偏向线程大概并非立即就停止了。由于只需偏向线程正在挪用非托管的代码而且还没有前往的话,该线程就不会立即停止。而假设偏向线程在挪用非托管的代码而且堕入了一个逝世轮回的话,该偏向线程就基础不会停止。不外这类情况只是一些惯例,更多的情况是偏向线程在挪用托管的代码,一旦Abort()被挪用那末该线程就立即停止了。在实践使用中,一个线程停止了另外一个线程,不外一再要等谁人线程统统停止了它才能够不休运转,如许的话我们就应该用到它的Join()举措。示例代码以下:thread.Abort();//请求停止另外一个线程thread.Join();//只到另外一个线程统统停止了,它才不休运转可是假设另外一个线程一向不克不及停止的话(缘故原由如前所述),我们就必要给Join()举措设置一个工夫范围,举措以下:thread.Join(5000);//停息5秒如许,在5秒后,不论谁人线程有无统统停止,本线程就强交运行了。该举措还前往一个布尔型的值,假设是true则表明谁人线程已统统停止了,而假设是false的话,则表明已超越了工夫范围了。时钟线程.
Net框架中的Timer类可让你使用时钟线程,它是蕴涵在System.Threading名字空间中的,它的感化便是在一定的工夫距离后挪用一个线程的举措。上面我给公共展现一个具体的实例,该实例以1秒为工夫距离,在无效羁系台中输入差别的字符串,代码以下:usingSystem;usingSystem.Threading;classMyApp{privatestaticboolTickNext=true;publicstaticvoidMain(){Console.WriteLine("PressEntertoterminate...");TimerCallbackcallback=newTimerCallback(TickTock);Timertimer=newTimer(callbacknull10001000);Console.ReadLine();}privatestaticvoidTickTock(objectstate){Console.WriteLine(TickNext?"Tick":"Tock");TickNext=!TickNext;}}从下面的代码中,我们晓得起首个函数回调是在1000毫秒后才发生的,今后的函数回调也是在每隔1000毫秒以后发生的,这是由Timer工具的机关函数中的第三个参数所决计的。程序会在1000毫秒的工夫距离后不休的发生新线程,只到用户输出回车才停止运转。不外值得注意的是,固然我们设置了工夫距离为1000毫秒,可是实践运转的时候一再其实不能十分准确。由于Windows把握系统并非一个及时系统,而公用言语运转时也不是及时的,因而因为线程调度的变化多端,实践的运转效果一再是不克不及准确到毫秒级的,可是关于一样平常的使用来讲那已是充足的了,因而你也不用非常苛求。小结本文先容了在.Net下举行多线程编程所必要掌控的一些基础常识。从文章中我们能够晓得在.Net下举行多线程编程绝对夙昔是有了年夜年夜的简化,可是其功效并没有被削弱。使用上述的一些基础常识,读者就能够试着编写.Net下的多线程程序了。不外要编写出功效更加紧年夜而且Bug少的多线程使用程序,读者必要掌控诸如线程同步、线程池等高等的多线程编程武艺。读者无妨参考一些把握系统方面或是多线程编程方面的武艺丛书。

竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。
精灵巫婆 该用户已被删除
沙发
发表于 2015-1-17 07:46:55 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
admin 该用户已被删除
板凳
发表于 2015-1-20 15:21:46 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
小妖女 该用户已被删除
地板
发表于 2015-1-29 12:13:40 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
变相怪杰 该用户已被删除
5#
发表于 2015-2-6 00:45:32 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
海妖 该用户已被删除
6#
发表于 2015-2-14 17:31:09 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
山那边是海 该用户已被删除
7#
发表于 2015-3-4 09:39:07 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
兰色精灵 该用户已被删除
8#
发表于 2015-3-11 18:10:14 | 只看该作者
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
深爱那片海 该用户已被删除
9#
发表于 2015-3-19 06:21:35 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
柔情似水 该用户已被删除
10#
发表于 2015-3-27 09:11:00 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-16 09:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表