2007年12月
导读: 上篇文章介绍了多种线程的创建方式,以及winform在多线程编程时的特殊性,这篇我们来介绍一下异步编程的经典模式和微软对其的实现 微软推荐的异步操作模型是事件模型,也即用子线程通过事件来通知调用者自己的工作状态,也就是设计模式中的observer模式,也可以看成是上文中线程类的扩展,最后实现后调用效果类似于 MyThread thread=newMyThread() thread.Work+=newThreadWork(Calculate) thread.WorkComplete+=newWorkComplete(DisplayResult) Calculate(objectsender, EventArgs e)){ .... } DisplayResult(objectsender, EventArgs e)){ ... } <例一> 阅读全文>
发表于 @ 2007年12月12日 16:16:00|评论(loading...)|编辑
导读: .Net提供了许多多线程编程工具,可能是因为太多了,所以掌握起来总是有一些头疼,我在这里讲讲我总结的一些多线程编程的经验,希望对大家有帮助 不需要传递参数,也不需要返回参数 我们知道启动一个线程最直观的办法是使用Thread类,具体步骤如下 ThreadStart threadStart=newThreadStart(Calculate); Thread thread=newThread(threadStart); thread.Start(); publicvoidCalculate(){ doubleDiameter=0.5; Console.Write("The perimeter Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI); } 例1 上面我们用定义了一个ThreadStart类型的委托,这个委托制定了线程需要执行的方法:Calculate,在这个方法里计算了一阅读全文>
发表于 @ 2007年12月12日 16:16:00|评论(loading...)|编辑
导读: 在HowToStart那帖中,我提到了ASP.NET MVC的问题 : 如果修改一次Controller的代码,就导致ASP.NET重启一次 , 那么会不会很麻烦? 有时候一个项目大一点, ASP.NET启动一次需要几十秒, 那样的等待真的很浪费时间. 与思归的交谈中, 他提到了HotSwap的概念. "热插拔" - 编写代码后不需要重新编译或重启ASP.NET. 怎样实现这个功能呢? 现在MVC的文档很少. 只能通过Reflector去找答案了. 一个Request,从Url, 一直到了具体的 Controller , 经过了那些步骤呢? 下面列出了这个步骤的详细: 1. Url 2. RouteTable 3. MvcRouteHandler 4. MvcHandler 5. ControllerBuilder 6. ControllerFactory 7. Controller 这个过程中, MvcRouteHandler 是连接 RouteTable 和 MvcHandler 的桥梁. Mvc阅读全文>
发表于 @ 2007年12月11日 13:26:00|评论(loading...)|编辑
导读: 导读 在写本系列文章的过程中,我遇到了很大的困惑:在我准备讲述问题A的时候,我发现需要先解释问题B;当我考虑如何讲解问题B的时候,又发现如果对问题C不够清楚,很难较好地理解问题B。好吧,事已至此,我决定从问题C开始着手。不幸的是…我已经跑题了。 阅读的过程中,你可能会觉得文中有的内容看上去与正在讨论的内容关系不大,这时候请你耐心地读下去,它往往是你理解后面问题的关键。 这将是一次漫长的旅途,如果你现在已经整装待发,那我们就上路吧! NOTE:文章中的插图是在IIS 6.0 和Windows Server2003 下截取的,如果与IIS 5.0的区别大到足以产生误导,请反馈给我。 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net。他们耐心、细致地告诉你如何一步步拖放控件、设置控件属性、编写CodeBehind代码,以实现某个特定的功能。 这种做法,实际上是回答了“如何去做”的问题,却没有回答“为什么可以这样做”的问题。 尽管我很推崇 悉江华 先生的《圣殿祭祀的Asp.Net开发详解》一书阅读全文>
发表于 @ 2007年12月11日 13:23:00|评论(loading...)|编辑
导读: 引言 在Part.1中,我们了解了Http请求的处理过程以及其它一些运作原理。我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpModule,但在Part.1中,我并没有详细讲述如何对它们进行编程,只是轻描淡写地一笔带过。所谓学以致用,前面已经介绍了不少概念和原理。在本文中,我们通过几个范例来了解IHttpHandler,看看掌握这些原理的实际用途。 IHttpHandler 概述 可能和我一样,很多Asp.Net开发人员都有过Asp的背景,以至于我们在开发程序的时候,通常都是在“页面级”上思考,也就是说我们现在正在做的这个页面应该有什么样的功能,是进行一个问卷调查还是一个数据库查询等等。而很少在“请求级”思考,考虑有没有办法来通过编码的方式来操控一个Http请求。 实际上,Framework提供了一系列的接口和类,允许你对于Http请求进行编程,而实现这一操作的一个主要的接口,就是IHttpHandler(另一个是IHttpModule)。 应该还记得第一节中我们提到过ISAPI,它根据文件名后缀把不同阅读全文>
发表于 @ 2007年12月11日 13:22:00|评论(loading...)|编辑
导读: PDF版浏览: http://www.cnblogs.com/Files/JimmyZhang/Delegates-and-Events-in-CSharp.pdf 更新记录: 2007年 9月28日:事件的由来 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(bi)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、委托和事件对Observer设计模式的意义、.Net Framework中的委托和事件,对它们的中间代码也做了讨论。 将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { // 做某些额外的事情,比如初始化之类阅读全文>
发表于 @ 2007年12月11日 13:22:00|评论(loading...)|编辑
导读: 引言 Http 请求处理流程和 Http Handler 介绍这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IHttpHandler接口的类进行处理(应该记得Page类实现了IHttpHandler)。从 Http 请求处理流程一文的最后的一幅图中可以看到,在Http请求由IHttpHandler处理之前,它需要通过一系列的Http Module;在请求处理之后,它需要再次通过一系列的Http Module,那么这些Http Module是如何组成的?用来做什么呢?本文将对Http Module作以介绍。 Http Module概述 暂时先不考虑我们自己实现Http Module的情况。在.Net中,Http Module 是实现了IHttpModule接口的程序集。IHttpModule 接口本身并没有什么好大写特写的,由它的名字可以看出,它不过是一个普普通通的接口而已。实际上,我们关心的是实现了这些接口的类,如果我们也编写代码实现了这个接口,那么有什么用途。一般来说,我们可以将Asp.Net阅读全文>
发表于 @ 2007年12月11日 13:22:00|评论(loading...)|编辑
Csdn Blog在2007年,由于访问量和数据量的大幅度增长,使得我们原有的在.text 0.96版本上修改的代码基本不堪重负。
在数据库方面主要表现为,单单文章表,2007年1年的数据已经达到了30G的量(最后的解决方案是对把文章表分为两个表,分别存放文章相关信息和专门存放文章内容的表,然后对两个表作分区)。熟悉.Text得朋友可能知道,有一个专门记录流量的表,页面内的每一次点击,直接记录到数据库里面,反映到页面上就是单个用户的博客流量,分别是EntryID,BlogID,DateTime,表名称叫做blog_viewcount,这个表我们现在已经到了4亿的数据,之前仅仅是优化索引和索引试图来在真实的环境中查看到底sql2005单表能负载多大的量。阅读全文>
发表于 @ 2007年12月07日 14:00:00|评论(loading...)|编辑
导读: 介绍 你的网站在并发访问很大并且无法承受压力的情况下,你会选择如何优化? 很多人首先会想从服务器缓存方面着手对程序进行优化,许多不同的服务器缓存方式都有他们自己的特点,像我曾经参与的一些项目中,根据缓存的命中率不同使用过 Com+/Enterprise Libiary Caching/Windows服务,,静态文件等方式的服务器端缓存和 HTTP Compression技术,但客户端缓存往往却被人们忽略了,即使服务器的缓存让你的页面访问起来非常地快,但她依然需要依赖浏览器下载并输出,而当你加入客户端缓存时,会给你带来非常多的好处.因为她可以对站点中访问最频繁的页进行缓存充分地提高 Web 服务器的吞吐量(通常以每秒的请求数计算)以提升应用程序性能和可伸缩性。 一个在线购物调查显示,大多数人愿意去商店排队,但在在线购物时却不愿意等待。Websense调查公司称多达70%的上网者表示不愿意在页面读取上超过10秒钟。超过70%的人会因为中途速度过慢而取消当前的订单。 基础知识 1) 什么是”Last-Modified”? 在浏览器第一次请求某一个URL时,阅读全文>
发表于 @ 2007年12月06日 14:08:00|评论(loading...)|编辑
导读: 1 前言 性能优化的主要目标是提高“并发用户数量”,“吞吐量”,“可靠性”这样几个指标。 本质上说,性能优化的工作应该是多方面的,要做到“点面结合、由表及里”。比如:从代价的角度来考虑,应尽量做到改动量小,易实施;从用户角度看,应做到快速响应或快速提示;从软件结构的角度看,又要兼顾到系统结构的合理性和可扩展性。由此不难发现,在尝试一些改进方法时往往很难做到面面俱到。 举一个简单的例子: 在一个业务逻辑类中,我们封装了一些处理方法,其中有一个方法的功能是查找一个节点ID在XML文件是否已经存在。那我们自然会想到写两个方法: XmlDocument LoadXML(string strFileID) //加载XML bool CheckIDExisit(string strFileID,string strID) //判断节点是否存在 而且,加载XML的方法在其他地方还可以重用;表面上看,这段代码的结构和功能都没有问题。可是在运行时,如果你的逻辑中直接或间接调用了LoadXML多次的话,你会发现程序很慢。原因就在于加载XML文件是个耗时动作,阅读全文>
发表于 @ 2007年12月06日 14:08:00|评论(loading...)|编辑
导读: Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁,说明内存不足。“页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存,也是可以接受的,但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况,请从以下的对象计数器开始: Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。 page/sec: 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引起的硬盘数据流量)。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。 page r阅读全文>
发表于 @ 2007年12月06日 14:07:00|评论(loading...)|编辑
导读: 优化数据库服务器时,您需要优化个人查询性能。这与优化服务器安装的其他影响硬件和软件配置等性能的方面一样重要 — 甚至更为重要。 即使数据库服务器是在功能最强大的硬件上运行,它的性能还是可能会因为一些行为错误的查询而受到负面影响。实际上,只要有一个坏的查询(有时称为“失控查询”),就可能导致数据库出现严重的性能问题。 反之,通过优化一组成本最高或最常执行的查询,可以极大地提高数据库的整体性能。在本文中,我将探讨一些技术,您可使用这些技术识别并优化服务器上成本最高和性能最坏的查询。 分析执行计划 优化个人查询时,通常通过查看查询的执行计划开始。此执行计划描述 SQL ServerTM为满足查询和生成所需结果集而执行的物理和逻辑操作的顺序。此执行计划是在查询处理的最优化阶段由称为查询优化器的数据库引擎组件生成的,这要考虑到许多不同的因素,例如,查询中使用的搜索谓词、涉及的表和其连接条件、返回的列清单,以及是否存在能用作数据的有效访问路径的有用索引。 对于复杂的查询,所有可能排列的数量可能非常大,因此查询优化器不评估所有的可能性,而是尝试查找对于给阅读全文>
发表于 @ 2007年12月06日 14:05:00|评论(loading...)|编辑