老尸 发表于 2015-1-16 22:18:44

ASP.NET教程之在Framework4.0中怎样完成提早加载

以前学了大概半年时间的asp(没有机会做大系统,最多是自己对公司系统做些调整和修改还有一些小程序)。应该说开始接触asp.net是今年元月5号的事。现在很想把公司的系统重新用.net来架构,却不知道如何下手。</p>提早加载,亦称提早实例化,提早初始化等,次要表达的头脑是,把工具的创立将会提早到利用时创立,而不是在工具实例化时创立工具,即用时才加载。这类体例有助于进步于使用程序的功能,制止华侈盘算,节俭内存的利用等。针关于这类做法,仿佛称之为即用即创立更加符合些。
先来看一下在Framework4.0中怎样完成提早加载。
Framework4.0供应了一个包装类Lazy,能够轻松的完成提早加载。


[*]///这行代码标明:要创立一个提早加载的字符串工具s
[*]///原型为LazyT>工具名=newLazyT>(FunT>)
[*]///接纳泛型托付举行机关,实例化此托付时请求必需是前往值T范例的办法
[*]///如在本例中,T为string,则TestLazy.GetString办法的前往值必需也是string范例
[*]Lazystring>s=newLazystring>(TestLazy.GetString);

本例中TestLazy.GetString()办法以下示:


[*]publicclassTestLazy
[*]{
[*]publicstaticstringGetString()
[*]{
[*]returnDateTime.Now.ToLongTimeString();
[*]}
[*]}

能够经由过程IsValueCreated属性来断定工具是不是已创立,经由过程Value属性来猎取以后工具的值。


[*]Console.WriteLine(s.IsValueCreated);//前往False
[*]Console.WriteLine(s.IsValueCreated);//前往True

上面经出完全代码,以供测试:


[*]classProgram
[*]{
[*]staticvoidMain(string[]args)
[*]{
[*]///这行代码标明:要创立一个提早加载的字符串工具s
[*]///原型为Lazy工具名=newLazy(Fun)
[*]///接纳泛型托付举行机关,实例化此托付时请求必需是前往值T范例的办法
[*]///如在本例中,T为string,则TestLazy.GetString办法的前往值必需也是string范例
[*]Lazys=newLazy(TestLazy.GetString);
[*]Console.WriteLine(s.IsValueCreated);//前往False
[*]Console.WriteLine(s.IsValueCreated);//前往True
[*]}
[*]}
[*]publicclassTestLazy
[*]{
[*]publicstaticstringGetString()
[*]{
[*]returnDateTime.Now.ToLongTimeString();
[*]}
[*]}

上面再用一个例子,演示提早加载:
在这个例子中,利用了BlogUser工具,该工具包括多个Article工具,当加载BlogUser工具时,Article工具其实不加载,当必要利用Article工具时,才加载。


[*]classProgram
[*]{
[*]staticvoidMain(string[]args)
[*]{
[*]BlogUserblogUser=newBlogUser(1);
[*]Console.WriteLine("blogUserhasbeeninitialized");
[*]{
[*]Console.WriteLine(article.Title);}
[*]}
[*]}
[*]publicclassBlogUser
[*]{
[*]publicintId{get;privateset;}
[*]publicLazy>Articles{get;privateset;}
[*]publicBlogUser(intid)
[*]{
[*]this.Id=id;
[*]Articles=newLazy>(()=>ArticleServices.GetArticesByID(id));
[*]Console.WriteLine("BlogUserInitializer");
[*]}
[*]}
[*]publicclassArticle
[*]{
[*]publicintId{get;set;}
[*]publicstringTitle{get;set;}
[*]publicDateTimePublishDate{get;set;}
[*]publicclassArticleServices
[*]{
[*]publicstaticListGetArticesByID(intblogUserID)
[*]{
[*]Listarticles=newList{
[*]newArticle{Id=1,Title="LazyLoad",PublishDate=DateTime.Parse("2011-4-20")},
[*]newArticle{Id=2,Title="Delegate",PublishDate=DateTime.Parse("2011-4-21")},
[*]newArticle{Id=3,Title="Event",PublishDate=DateTime.Parse("2011-4-22")},
[*]newArticle{Id=4,Title="Thread",PublishDate=DateTime.Parse("2011-4-23}
[*]};
[*]Console.WriteLine("ArticleInitalizer");
[*]returnarticles;
[*]}
[*]}

运转了局如图示:



最初说一下,提早加载次要使用场景:
当创立一个工具的子工具开支对照年夜时,并且有大概在程序顶用不到这个子工具,那末能够思索用提早加载的体例来创立子工具。别的一种情形就是当程序一启动时,必要创立多个工具,但唯一几个工具必要当即利用,如许就能够将一些不用要的初始化事情提早到利用时,如许能够十分无效的进步程序的启动速率。
这类手艺在ORM框架失掉了普遍使用,也并不是C#独占的,好比Java里的Hibernate框架也利用了这一手艺。
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。

柔情似水 发表于 2015-1-19 08:04:01

对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。

小妖女 发表于 2015-1-24 17:55:20

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

若相依 发表于 2015-2-2 11:41:02

Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。

冷月葬花魂 发表于 2015-2-7 19:19:57

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

深爱那片海 发表于 2015-2-23 04:05:40

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

活着的死人 发表于 2015-3-7 06:10:25

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。

透明 发表于 2015-3-21 10:32:04

对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。
页: [1]
查看完整版本: ASP.NET教程之在Framework4.0中怎样完成提早加载