<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[天大地博-天博工作室]]></title>
<link>http://blog.stdns.net/</link>
<description><![CDATA[Heaven and Earth is Big, Vast Vista]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[webmaster@stdns.net(月亮太阳)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>天大地博-天博工作室</title>
	<url>http://blog.stdns.net/images/logos.gif</url>
	<link>http://blog.stdns.net/</link>
	<description>天大地博-天博工作室</description>
</image>

			<item>
			<link>http://blog.stdns.net/article.asp?id=347</link>
			<title><![CDATA[5分钟让你明白金融危机爆发原因]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Nonsense]]></category>
			<pubDate>Mon,29 Dec 2008 15:50:57 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=347</guid>
		<description><![CDATA[　　一。杠杆。目前，许多投资银行为了赚取暴利，采用20－30倍杠杆操作，假设一个银行A自身资产为30亿，30倍杠杆就是900亿。也就是说，这个银行A以 30亿资产为抵押去借900亿的资金用于投资，假如投资盈利5％，那么A就获得45亿的盈利，相对于A自身资产而言，这是150％的暴利。反过来，假如投资亏损5％，那么银行A赔光了自己的全部资产还欠15亿。 　<br/>　　<br/>　　二。 CDS合同。由于杠杆操作高风险，所以按照正常的规定，银行不运行进行这样的冒险操作。所以就有人想出一个办法，把杠杆投资拿去做“保险”。这种保险就叫 CDS。比如，银行A为了逃避杠杆风险就找到了机构B。机构B可能是另一家银行，也可能是保险公司，诸如此类。A对B说，你帮我的贷款做违约保险怎么样，我每年付你保险费5千万，连续10年，总共5亿，假如我的投资没有违约，那么这笔保险费你就白拿了，假如违约，你要为我赔偿。A想，如果不违约，我可以赚 45亿，这里面拿出5亿用来做保险，我还能净赚40亿。如果有违约，反正有保险来赔。所以对A而言这是一笔只赚不赔的生意。B是一个精明的人，没有立即答应A的邀请，而是回去做了一个统计分析，发现违约的情况不到1％。如果做一百家的生意，总计可以拿到500亿的保险金，如果其中一家违约，赔偿额最多不过 50亿，即使两家违约，还能赚400亿。A,B双方都认为这笔买卖对自己有利，因此立即拍板成交，皆大欢喜。 　<br/>　<br/>　　三。 CDS市场。B做了这笔保险生意之后，C在旁边眼红了。C就跑到B那边说，你把这100个CDS卖给我怎么样，每个合同给你2亿，总共200亿。B想，我的400亿要10年才能拿到，现在一转手就有200亿，而且没有风险，何乐而不为，因此B和C马上就成交了。这样一来，CDS就像股票一样流到了金融市场之上，可以交易和买卖。实际上C拿到这批CDS之后，并不想等上10年再收取200亿，而是把它挂牌出售，标价220亿；D看到这个产品，算了一下，400亿减去220亿，还有180亿可赚，这是“原始股”，不算贵，立即买了下来。一转手，C赚了20 亿。从此以后，这些CDS就在市场上反覆的抄，现在CDS的市场总值已经抄到了62万亿美元。 　　　<br/><br/>　　四。 次贷。上面 A,B,C,D,E,F....都在赚大钱，那么这些钱到底从那里冒出来的呢？从根本上说，这些钱来自A以及同A相仿的投资人的盈利。而他们的盈利大半来自美国的次级贷款。人们说次贷危机是由于把钱借给了穷人。笔者对这个说法不以为然。笔者以为，次贷主要是给了普通的美国房产投资人。这些人的经济实力本来只够买自己的一套住房，但是看到房价快速上涨，动起了房产投机的主意。他们把自己的房子抵押出去，贷款买投资房。这类贷款利息要在8％－9％以上，凭他们自己的收入很难对付，不过他们可以继续把房子抵押给银行，借钱付利息，空手套白狼。此时A很高兴，他的投资在为他赚钱；B也很高兴，市场违约率很低，保险生意可以继续做；后面的C,D,E,F等等都跟着赚钱。 　<br/>　<br/>　　五。次贷危机。房价涨到一定的程度就涨不上去了，后面没人接盘。此时房产投机人急得像热锅上的蚂蚁。房子卖不出去，高额利息要不停的付，终于到了走头无路的一天，把房子甩给了银行。此时违约就发生了。此时A感到一丝遗憾，大钱赚不着了，不过也亏不到那里，反正有B做保险。B也不担心，反正保险已经卖给了C。那么现在这份CDS保险在那里呢，在G手里。G刚从F手里花了300 亿买下了 100个CDS，还没来得及转手，突然接到消息，这批CDS被降级，其中有20个违约，大大超出原先估计的1％到2％的违约率。每个违约要支付50亿的保险金，总共支出达1000亿。加上300亿CDS收购费，G的亏损总计达1300亿。虽然G是全美排行前10名的大机构，也经不起如此巨大的亏损。因此G 濒临倒闭。<br/>　　<br/>　　六。金融危机。如果G倒闭，那么A花费5亿美元买的保险就泡了汤，更糟糕的是，由于A采用了杠杆原理投资，根据前面的分析，A 赔光全部资产也不够还债。因此A立即面临破产的危险。除了A之外，还有A2，A3,...,A20，统统要准备倒闭。因此G,A,A2,...,A20一起来到美国财政部长面前，一把鼻涕一把眼泪地游说，G万万不能倒闭，它一倒闭大家都完了。财政部长心一软，就把G给国有化了，此后A,...,A20的保险金总计1000亿美元全部由美国纳税人支付。 　　<br/><br/>　　七。美元危机。上面讲到的100个CDS的市场价是300亿。而CDS市场总值是62万亿，假设其中有10％的违约，那么就有6万亿的违约CDS。这个数字是300亿的200倍。如果说美国收购价值300亿的CDS之后要赔出1000亿。那么对于剩下的那些违约CDS，美国就要赔出 20万亿。如果不赔，就要看着A20,A21,A22等等一个接一个倒闭。无论采取什么措施，美元大贬值已经不可避免。 　<br/>　　<br/>　　以上计算所用的假设和数字同实际情况会有出入，但美国金融危机的严重性无法低估。]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=346</link>
			<title><![CDATA[老婆、孩子、网站 年度总结忏悔]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Diary]]></category>
			<pubDate>Sat,13 Dec 2008 14:28:26 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=346</guid>
		<description><![CDATA[有人问过，做站是技术优先还是内容优先。我不知道，该怎么回答。<br/><br/>因为做网站离不开技术，而技术又是为了给内容做铺垫。<br/><br/>其实，我更偏向于内容。我做站这几年来，一直没有用过采集，因为我怕强奸了浏览我网站的网友的视觉，也怕侮辱了做网站的初衷。<br/><br/>每天每夜为了添加内容，总是弄到很晚，有时候也自己怀疑过这么做是不是值得，但是每当自己添加的内容被搜索引擎收录的时候，心理面还是有不住的狂喜，那种感情与感觉绝不是靠采集做站的人能想象的到的。<br/><br/>别人做站很轻松，老婆说我做站很辛苦。无数的夜晚，我都是看着老婆<a href="http://www.i3baby.cn" target="_blank">孩子</a>睡着后，才开始我的工作，每当东方发白的时候，我才记起我还得睡觉........<br/><br/>老婆很辛苦，结婚这么多年和我没有逛过几回街，她一直在背后默默的支持着我，有时候觉得真的对不起她，我想让她过好日子，可是微薄的收入，让她不能想别的女人一样穿高档的衣服，开上她梦想中的汽车。<br/><br/><a href="http://www.i3baby.cn" target="_blank">孩子</a>很乖，每当他晚上睡觉的时候都没有让我陪过他，他知道爸爸要“上网”(<a href="http://www.i3baby.cn" target="_blank">孩子</a>还小，不知道什么叫做站)。每次他想去动物园玩或者去游乐场，他从不敢对我说，怕打扰我，总是先给妈妈说，让妈妈给我好好商量。<br/><br/>我很难过，1000多个日日夜夜，我把网络和建站当成了我第二个家，却忽略了我自己的家。2009年，就要到了，我不能给我的老婆<a href="http://www.i3baby.cn" target="_blank">孩子</a>什么像样子的礼物，我只能在这里写篇“软文”做为自己年终的总结与忏悔!]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=345</link>
			<title><![CDATA[div+css命名规则-增强SEO]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Web Design]]></category>
			<pubDate>Fri,21 Nov 2008 14:25:27 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=345</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;页头：header<br/>&nbsp;&nbsp;&nbsp;&nbsp;登录条：loginBar<br/>&nbsp;&nbsp;&nbsp;&nbsp;标志：logo<br/>&nbsp;&nbsp;&nbsp;&nbsp;侧栏：sideBar<br/>&nbsp;&nbsp;&nbsp;&nbsp;广告：banner<br/>&nbsp;&nbsp;&nbsp;&nbsp;导航：nav<br/>&nbsp;&nbsp;&nbsp;&nbsp;子导航：subNav<br/>&nbsp;&nbsp;&nbsp;&nbsp;菜单：menu<br/>&nbsp;&nbsp;&nbsp;&nbsp;子菜单：subMenu<br/>&nbsp;&nbsp;&nbsp;&nbsp;搜索：search<br/>&nbsp;&nbsp;&nbsp;&nbsp;滚动：scroll<br/>&nbsp;&nbsp;&nbsp;&nbsp;页面主体：main<br/>&nbsp;&nbsp;&nbsp;&nbsp;内容：content<br/>&nbsp;&nbsp;&nbsp;&nbsp;标签页：tab<br/>&nbsp;&nbsp;&nbsp;&nbsp;文章列表：list<br/>&nbsp;&nbsp;&nbsp;&nbsp;提示信息：msg<br/>&nbsp;&nbsp;&nbsp;&nbsp;小技巧：tips<br/>&nbsp;&nbsp;&nbsp;&nbsp;栏目标题：title<br/>&nbsp;&nbsp;&nbsp;&nbsp;加入：joinus<br/>&nbsp;&nbsp;&nbsp;&nbsp;指南：guild<br/>&nbsp;&nbsp;&nbsp;&nbsp;服务：service<br/>&nbsp;&nbsp;&nbsp;&nbsp;热点：hot<br/>&nbsp;&nbsp;&nbsp;&nbsp;新闻：news<br/>&nbsp;&nbsp;&nbsp;&nbsp;下载：download<br/>&nbsp;&nbsp;&nbsp;&nbsp;注册：regsiter<br/>&nbsp;&nbsp;&nbsp;&nbsp;状态：status<br/>&nbsp;&nbsp;&nbsp;&nbsp;按钮：btn<br/>&nbsp;&nbsp;&nbsp;&nbsp;投票：vote<br/>&nbsp;&nbsp;&nbsp;&nbsp;合作伙伴：partner<br/>&nbsp;&nbsp;&nbsp;&nbsp;友情链接：friendLink<br/>&nbsp;&nbsp;&nbsp;&nbsp;页脚：footer<br/>&nbsp;&nbsp;&nbsp;&nbsp;版权：copyRight<br/>&nbsp;&nbsp;&nbsp;&nbsp;1.CSS ID 的命名<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;外　套：　　wrap<br/>&nbsp;&nbsp;&nbsp;&nbsp;主导航：　　mainNav<br/>&nbsp;&nbsp;&nbsp;&nbsp;子导航：　　subnav<br/>&nbsp;&nbsp;&nbsp;&nbsp;页　脚：　　footer<br/>&nbsp;&nbsp;&nbsp;&nbsp;整个页面：　content<br/>&nbsp;&nbsp;&nbsp;&nbsp;页　眉：　　header<br/>&nbsp;&nbsp;&nbsp;&nbsp;页　脚：　　footer<br/>&nbsp;&nbsp;&nbsp;&nbsp;商　标：　　label<br/>&nbsp;&nbsp;&nbsp;&nbsp;标　题：　　title<br/>&nbsp;&nbsp;&nbsp;&nbsp;主导航：　　mainNav（globalNav）<br/>&nbsp;&nbsp;&nbsp;&nbsp;顶导航：　　topnav<br/>&nbsp;&nbsp;&nbsp;&nbsp;边导航：　　sidebar<br/>&nbsp;&nbsp;&nbsp;&nbsp;左导航：　　leftsideBar<br/>&nbsp;&nbsp;&nbsp;&nbsp;右导航：　　rightsideBar<br/>&nbsp;&nbsp;&nbsp;&nbsp;旗　志：　　logo<br/>&nbsp;&nbsp;&nbsp;&nbsp;标　语：　　banner<br/>&nbsp;&nbsp;&nbsp;&nbsp;菜单内容1： menu1Content<br/>&nbsp;&nbsp;&nbsp;&nbsp;菜单容量：　menuContainer<br/>&nbsp;&nbsp;&nbsp;&nbsp;子菜单：　　submenu<br/>&nbsp;&nbsp;&nbsp;&nbsp;边导航图标：sidebarIcon<br/>&nbsp;&nbsp;&nbsp;&nbsp;注释：　　　note<br/>&nbsp;&nbsp;&nbsp;&nbsp;面包屑：　　breadCrumb(即页面所处位置导航提示）<br/>&nbsp;&nbsp;&nbsp;&nbsp;容器：　　　container<br/>&nbsp;&nbsp;&nbsp;&nbsp;内容：　　　content<br/>&nbsp;&nbsp;&nbsp;&nbsp;搜索：　　　search<br/>&nbsp;&nbsp;&nbsp;&nbsp;登陆：　　　login<br/>&nbsp;&nbsp;&nbsp;&nbsp;功能区：　　shop(如购物车，收银台)<br/>&nbsp;&nbsp;&nbsp;&nbsp;当前的　　　current<br/><br/>2.另外在编辑样式表时可用的注释可这样写：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;– Footer –&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;内容区<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;– End Footer –&gt;<br/><br/>3.样式文件命名<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;主要的 master.css<br/>&nbsp;&nbsp;&nbsp;&nbsp;布局，版面 layout.css<br/>&nbsp;&nbsp;&nbsp;&nbsp;专栏 columns.css<br/>&nbsp;&nbsp;&nbsp;&nbsp;文字 font.css<br/>&nbsp;&nbsp;&nbsp;&nbsp;打印样式 print.css<br/>&nbsp;&nbsp;&nbsp;&nbsp;主题 themes.css]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=344</link>
			<title><![CDATA[CSS 设计中的黄金分割率应用]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Web Design]]></category>
			<pubDate>Mon,10 Nov 2008 14:35:21 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=344</guid>
		<description><![CDATA[　　希腊Web 设计师Christos Chiotis 发表在 CssGlobe 的一篇文章，讲述了黄金分割率在 CSS 中的应用。黄金分割率是一个应用广泛的数学常数，大约为 1.6180339887。黄金分割率用在 Web 设计中，可以为设计带来更多视觉上的和谐。<br/><br/>　　在一个简单的两栏式页面布局中，使用两个容器，第一个容器用来显示主要内容，第二个容器显示侧条。比如，页面宽度为 960 px，使用黄金分割率，主内容容器的宽度应该为 960 / 1.62 = 593 px，而侧条的宽度为 960-593=367 px。<br/> <br/><br/>　　作者建议，在 Web 排版与布局中可以使用以下基本 CSS 设置<br/><br/>　　line-height = font-size * 1.62<br/><br/>　　paragraph margin = paragraph line-height * 1.62 / 2<br/><br/>　　header’s margin-top = headers line-height * 1.62<br/><br/>　　不过对中文而言，至少 font-size 和 line-height 之间使用黄金分割率是不适合的，假如中文字体使用 12px 的话，最佳行高是 22px，如果字体使用 14px 的话，行高应该使用 24px - 译者。<br/> <br/>　　另一个例子，在表单中，输入框的宽度应该是标签文字的宽度乘以 1.62。而对于显示在 Web 上矩形来说，它的宽度应该是高度乘以 1.62。<br/><br/>　　这样一来，Web 设计师同时需要很好的计算能力，至少要在旁边放一台计算器，为了节省时间，作者建议在设计中随时记住一个 62/38 原则，在任何需要分割的地方，都使用 62% 和 38% 作比例。<br/><br/>　　对于需要分割成三份的场合，可以先按 62%，38%原则分成两份，再将那份大的按 62% 和 38% 的比例分割。]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=342</link>
			<title><![CDATA[VisualStudio2005技巧集合--你真的会使用断点吗?]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[OOP]]></category>
			<pubDate>Thu,30 Oct 2008 16:11:14 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=342</guid>
		<description><![CDATA[下面有从浅入深的6个问题,您可以尝试回答一下<br/>一个如下的语句for (int i = 0; i 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢?你有一个表达式在上面循环的某一次发生了变化，你想知道是哪一次，在哪个地方，怎么才能做到？你希望你的断点在被命中100次后，每命中三次中断一次，比如第103，第106，第109怎样做？你有在调试一个服务程序，希望在其内部打上了断点，可是，由于这是一个公用的服务你不希望其他访问这个服务的程序被你的调试所干扰，你想怎么办？怎样知道2个断点中断的时间间隔 <br/><strong>问题1,2</strong><br/>这两个问题最简单,我在一个例子里说明<br/>例如如下循环<br/>for(int i=0;i<br/>在循环的大括号上单击右键，插入断点，用这个方法，可以对付那些喜欢把语句写在一行上的家伙，其实，随着.Net3.5中Linq的出现，我们肯定也会经常在在一行上写复杂的表达式，这个时候用这种插入方法会比较管用<br/>ok，现在我们来编辑这个断点的条件，在断点上右键单击,选择如图菜单项<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/breakPoint_Condition.jpg" border="0" alt=""/><br/>在弹出的窗口中可以设置断点命中的条件i==900<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/breakpoint_condition_set.JPG" border="0" alt=""/><br/>注意我是在调试C#代码，默认的条件语句语法是C#，如果你想切换，那就需要用Ctrl-B，来插入断点，并在弹出窗口中选择语言<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/debug_setLanguage.jpg" border="0" alt=""/><br/>通过这样设置条件断点,我们就可以解决我们的问题1,2了<br/> <br/><strong>问题3</strong><br/>同样通过设置条件断点我们还可以解决我们的问题3,对表达式变化的跟踪<br/>string user=&#34;yizhu2000&#34;<br/>for(int i=0;i<br/>DoSomething1()<br/>.......<br/>DoSomethingN()<br/>}<br/>当循环执行完毕时我们发现user变成了&#34;smart_boy&#34;,你不知道这个值是在第几次循环的时候变化的,那么你是不是会选择打上断点,一次一次中断,来查看呢?当然不用<br/>在循环体结束的位置我们设置一个断点,打开条件编辑窗口(打开方法同上),设置表达式为user,勾选下面的HasChanged,也就是说,你告诉断点,当user的值发生变化时才触发<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/e&#173;xpression_changed.JPG" border="0" alt=""/><br/>(注意:第一次执行到断点的时候,程序一定会中断,并计算这时表达式的值,所以,所谓发生变化,指的是以后执行到断点是表达式的值和第一次执行到断点时表达式的值的比较)<br/><strong>问题4</strong><br/>如何让断点在指定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择Hit Count,会弹出如下窗口<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/hitcount.jpg" border="0" alt=""/><br/>在&#34;when the break point is hit&#34;下拉列表里,我们可以看到四个选项<br/>break always:总是中断<br/>break when the hit count is equal to:等于某次数时中断<br/>beak when the hit count is a multpile of:当次数是某数的倍数时中断<br/>break when the hit count is greater than o&#114; equal to:当大于等于某数时中断<br/><strong>问题5</strong><br/>前面4个问题都已经解决了,第5个问题的解决方法是利用断点的Filter功能,比如我希望断点只有被机器名为yizhu的机器访问才能触发,我可以这样设置<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/filter.JPG" border="0" alt=""/><br/>当其他机器访问程序的时候,断点将不会触发,这样做的优点是通过设置机器名,我们可以让其他机器访问的时候感觉不到断点的存在,除此之外我们可以设<br/>置机器名,进程号,进程名,线程号,线程名作为filter,而且还可以把他们组合起来,比如我希望通过当机器yizhu的dllhost进程调用时才触<br/>发,那么问题就可以设置为MachineName=&#34;yizhu&#34;&amp;ProcessName=&#34;dllhost&#34;<br/><strong>问题6</strong><br/>现在我们来解决第6个问题:<br/>在程序性能调试的时候,我们经常需要知道某段代码的执行效率,一般来说,我们可以在程序中加入时间点,通过时间点相减来取得时间间隔,这种方法有个<br/>显而易见的缺点就是需要修改程序,想要不修改程序,就需要借助一些工具,那么有没有什么方法可以声明式的插入时间点,并计算值呢?其实断点完全可以做到<br/>在给出方法前,我们来看看断点的另外一个设置项,When Hit,这个选项可以让我们在命中断点后做一些事情,包括输出一些内容,或者调用宏,比如输出一个程序中变量的值<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/when_hit.JPG" border="0" alt=""/><br/>我们输出了变量user的值，下面Continue Execution表示程序不会中断,输出后继续执行,注意表达式需要用{}括起来,，其他的部分会被作为字符串输出。设定WhenHit后断点变成了方形(看厌了圆断点,我还挺喜欢这个方家伙的)<br/>在output中查看输出结果,如下:<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/value_of_user.JPG" border="0" alt=""/><br/>既然可以计算表达式，我们的第一个最简方案就出来了，也就是在程序执行到断点的时候,输出DateTime.Now,这样当然是可行的,但是我们需<br/>要的是时间间隔,所以我们还需要自己来算个减法,还是挺麻烦的,怎么样才能让程序自己输出时间间隔呢?有一个想法是这样的,我们在上一个断点声明一个时间<br/>变量,然后在下面的断点里用DataTime.Now减去这个变量,即<br/>断点一的条件:{DateTime _t=DateTime.Now;}<br/>断点二的条件:{DateTime.Now-t;}<br/>看起来不错,但是实际运行时就有问题了,让我们看看输出吧<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/output.JPG" border="0" alt=""/><br/>上面高亮的部分说,变量申明只能在immediate window中进行,所以断点一的变量没有申明成功,关于immediatewindow,我们以后会涉猎到,反正就是说想在表达式里申明变量,没门,死路一条.那么我们怎么才能不申明变量又时间点呢?<br/>这时我想起了Thread.SetData 方法,这个方法可以往当前线程专门提供的空间中插入一些数据,并且可以通过GetData得到数据,具体细节参考<br/>[url=http://msdn2.microsoft.com/zh-cn/library/system.threading.thread.setdata%28VS.80%29.aspx]<br/>[color=&#34;#000080&#34;]http://msdn2.microsoft.com/zh-cn/library/system.threading.thread.setdata(VS.80).aspx[/color]<br/>[/url]<br/>于是方案就有了,在第一个断点处把时间放入Thread的DataSlot,然后第二个断点取出来相减<br/>断点一的条件:{Thread.SetData(Thread.GetNamedDataSlot(&#34;ExecutionTime&#34;),DateTime.Now);}<br/>断点二的条件:{DateTime.Now-(DateTime)System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot(&#34;ExecutionTime&#34;));}<br/>看看输出效果<br/><img src="http://images.cnblogs.com/cnblogs_com/yizhu2000/Result1.JPG" border="0" alt=""/><br/>我们的目的已经达到了,output中成功的输出了时间间隔,当然,还不是很完善,首先,这个方法限于两个断点,你想多打几个断点,测试两两间的间隔还是比较麻烦.测量精度也可以提高,大家有兴趣可以自己研究这个方法的扩展<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=341</link>
			<title><![CDATA[ADO.NET利用Excel作数据源时，字段处理的问题]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[OOP]]></category>
			<pubDate>Sat,25 Oct 2008 10:38:19 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=341</guid>
		<description><![CDATA[经常需要在数据库与Execl之间互导数据。net时代，ADO.NET可以使用使用Microsoft.Jet.OleDb访问访问Excel，网上已经有很多类似的资源，最典型也是最简单的可能如下：（asp.net环境）<br/> // 连接字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string xlsPath = Server.MapPath(&#34;~/app_data/somefile.xls&#34;); // 绝对物理路径<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string connStr = &#34;Provider=Microsoft.Jet.OLEDB.4.0;&#34; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;Extended Properties=Excel 8.0;&#34; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;data source=&#34; + xlsPath;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 查询语句<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string sql = &#34;Sel&#101;ct * FROM [Sheet1$]&#34;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSet ds = new DataSet();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbDataAdapter da = new OleDbDataAdapter(sql, connStr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;da.Fill(ds);&nbsp;&nbsp;&nbsp;&nbsp;// 填充DataSet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 在这里对DataSet中的数据进行操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 输出，绑定数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView1.DataSource = ds.Tables[0];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView1.DataBind();<br/>很简单吧？！一切就像操作数据库一样，只是需要注意的是：<br/>1。数据提供程序使用Jet，同时需要指定Extended Properties 关键字设置 Excel 特定的属性，不同版本的Excel对应不同的属性值：用于 Extended Properties 值的有效 Excel 版本。<br/>对于 Microsoft Excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿，请使用 Excel 8.0。<br/><br/>对于 Microsoft Excel 5.0 和 7.0 (95) 工作簿，请使用 Excel 5.0。<br/><br/>对于 Microsoft Excel 4.0 工作簿，请使用 Excel 4.0。<br/><br/>对于 Microsoft Excel 3.0 工作簿，请使用 Excel 3.0。<br/><br/>ref：<a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp" target="_blank" rel="external">http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp</a><br/><br/>2。数据源路径使用物理绝对路径（同Access）<br/><br/>3。如何引用表名？<br/>对 Excel 工作簿中表（或范围）的有效引用。<br/>若要引用完全使用的工作表的范围，请指定后面跟有美元符号的工作表名称。例如：<br/><br/>sel&#101;ct * from [Sheet1$]<br/>若要引用工作表上的特定地址范围，请指定后面跟有美元符号和该范围的工作表名称。例如：<br/><br/>sel&#101;ct * from [Sheet1$A1:B10]<br/>若要引用指定的范围，请使用该范围的名称。例如：<br/><br/>sel&#101;ct * from [MyNamedRange]<br/>ref：<a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp" target="_blank" rel="external">http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp</a><br/>说明：<br/>可以引用Excel 工作簿中的三种对象：<br/>• 整张工作表：[Sheet1$]&nbsp;&nbsp;，Sheet1 就是工作表的名称<br/>• 工作表上的命名单元格区域：[MyNamedRange] （不需要指定工作表，因为整个xls中命名区域只能唯一）<br/>XLS命名方法：选中单元格范围》插入》名称》定义<br/>• 工作表上的未命名单元格区域 ：[Sheet1$A1:B10]<br/>（在关系数据库提供的各种对象中（表、视图、存储过程等），Excel 数据源仅提供相当于表的对象，它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”，而工作表被视为“系统表”）<br/><br/>注意：<br/>•必须使用[]（方括号），否将报：<br/>FROM 子句语法错误<br/>•必须跟$（美元符号），否则报：<br/>Microsoft JetJets-of-the-Future Sep-07 数据库引擎找不到对象&#39;Sheet2&#39;。请确定对象是否存在，并正确地写出它的名称和路径。<br/>•如果工作表名称不对，或者不存在，将报：<br/>&#39;Sheet2$&#39; 不是一个有效名称。请确认它不包含无效的字符或标点，且名称不太长。<br/>•在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据&nbsp;&nbsp; 中提到可以使用<br/>~&nbsp;&nbsp;和 &#39;(波浪线和单引号）代替[]，使用ADO。NET测试没有成功，报：<br/>FROM 子句语法错误<br/>•当引用工作表明名（[Sheet1$]）时，数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始。比如，工作表从第 3 行，C 列开始，第3行，C列之前以及第1、2行全为空，则只会显示从第3行，C列开始的数据；以最后表最大范围内的非空单元结束；<br/>•因此，如需要精确读取范围，应该使用命名区域 [NamedRange]，或者指定地址：[Sheet1$A1:C10]<br/><br/>4。如何引用列名？<br/>•根据默认连接字符串中，数据提供程序会将有效区域内的第一行作为列名，如果此行某单元格为空则用F1、F2表示，其中序数，跟单元格的位置一致，从1开始；<br/>•如果希望第一行作为数据显示，而非列名，可以在连接串的 Extended Properties 属性指定：HDR=NO<br/>默认值为：HDR=NO 格式如下：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string connStr = &#34;Provider=Microsoft.Jet.OLEDB.4.0;&#34; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;Extended Properties=\&#34;Excel 8.0;HDR=NO\&#34;;&#34; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;data source=&#34; + xlsPath;<br/>注意： Excel 8.0;HDR=NO&nbsp;&nbsp;需要使用双引号（这里的反斜扛，是C#中的转义）<br/><br/>ref：ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs /WD_ADONET/html/745c5f95-2f02-4674-b378-6d51a7ec2490.htm 中《连接Excel》节（说明：在我自己的MSDN中，它的例子使用了两个双引号是错的，测试没有通过，原文这样说的：<br/><br/>注意，Extended Properties 所需的双引号必须还要加双引号。<br/>）<br/><br/>在这种情况下，所有的列名都是以F开头，然后跟索引，从F1开始，F2，F3。。。。。。。<br/><br/>5。为什么有效单元格数据不显示出来？<br/>出现这种情况的可能原因是，默认连接中，数据提供程序根据前面单元格推断后续单元个的数据类型。<br/>可以通过 Extended Properties 中指定 IMEX=1<br/><br/>“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取<br/>ref：同4<br/><br/>PS：在baidu这个问题的时候，有网友说，将每个单元都加上引号，这固然是格方案，但是工作量何其大啊，又不零活，庆幸自己找到”治本药方“<br/> <br/>more ref：<br/>如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据<br/><a href="http://dotnet.aspx.cc/ShowDetail.aspx?id=C673E2CD-3F1E-4919-8CE0-D69B894A0599" target="_blank" rel="external">http://dotnet.aspx.cc/ShowDetail.aspx?id=C673E2CD-3F1E-4919-8CE0-D69B894A0599</a><br/> <br/><br/>应用程序经常需要与Excel进行数据交互，以上阐述了基于ADO.NET 读取Excel的基本方法与技巧。现在要介绍是如何动态的读取Excel数据，这里的动态指的是事先不知道Excel文件的是什么样的结构，或者无法预测，比如一张.xls文件有多少张sheet，而且每张sheet的结构可能都不一样等等。<br/>其实我们可以通过获取Excel的“架构信息”来动态的构造查询语句。这里的“架构信息”与数据库领域的“数据库架构信息”意义相同（也称“元数据”），对于整个数据库，这些“元数据”通常包括数据库或可通过数据库中的数据源、表和视图得到的目录以及所存在的约束等；而对于数据库中的表，架构信息包括主键、列和自动编号字段等。<br/>在上文中提到<br/><br/>在关系数据库提供的各种对象中（表、视图、存储过程等），Excel 数据源仅提供相当于表的对象，它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”，而工作表被视为“系统表”）<br/><br/> <br/><br/>这里我们将Excel也当作一个“数据库”来对待，然后利用OleDbConnection.GetOleDbSchemaTable 方法<br/>要获取所需的架构信息，该方法获取的架构信息与ANSI SQl-92是兼容的：<br/><br/>注意：对于那些不熟悉 OLE DB 架构行集的人而言，它们基本上是由 ANSI SQL-92 定义的数据库构造的标准化架构。每个架构行集具有为指定构造提供定义元数据的一组列（称作 .NET 文档中的“限制列”）。这样，如果请求架构信息（例如，列的架构信息或排序规则的架构信息），则您会明确知道可以得到哪种类型的数据。如果希望了解更多信息，请访问 Appendix B:Schema Rowsets。<br/>ref：<a href="http://www.microsoft.com/china/msdn/library/office/office/odatanet2.mspx?mfr=true" target="_blank" rel="external">http://www.microsoft.com/china/msdn/library/office/office/odatanet2.mspx?mfr=true</a><br/><br/>以下是读取Excel文件内“表”定义元数据，并显示出来的的程序片断：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 读取Excel数据，填充DataSet<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 连接字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string xlsPath = Server.MapPath(&#34;~/app_data/somefile.xls&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string connStr = &#34;Provider=Microsoft.Jet.OLEDB.4.0;&#34; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;Extended Properties=\&#34;Excel 8.0;HDR=No;IMEX=1\&#34;;&#34; + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002)，并且第一行作为数据返回，且以文本方式读取<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;data source=&#34; + xlsPath;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string sql_F = &#34;Sel&#101;ct * FROM [{0}]&#34;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbConnection conn = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbDataAdapter da = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataTable tblSchema = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IList&lt;string&gt; tblNames = null;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化连接，并打开<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = new OleDbConnection(connStr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Open();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据源的表定义元数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//tblSchema = conn.GetSchema(&#34;Tables&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, &#34;TABLE&#34; });<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView1.DataSource = tblSchema;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView1.DataBind();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 关闭连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Close();<br/>GetOleDbSchemaTable 方法的详细说明可以参考：<br/><a href="http://msdn2.microsoft.com/zh-CN/library/system.data.oledb.oledbconnection.getoledbschematable.aspx" target="_blank" rel="external">http://msdn2.microsoft.com/zh-CN/library/system.data.oledb.oledbconnection.getoledbschematable.aspx</a><br/><br/>接着是一段利用“架构信息”动态读取Excel内部定义的表单或者命名区域的程序片断：<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 读取Excel数据，填充DataSet<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 连接字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string xlsPath = Server.MapPath(&#34;~/app_data/somefile.xls&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string connStr = &#34;Provider=Microsoft.Jet.OLEDB.4.0;&#34; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;Extended Properties=\&#34;Excel 8.0;HDR=No;IMEX=1\&#34;;&#34; + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002)，并且第一行作为数据返回，且以文本方式读取<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;data source=&#34; + xlsPath;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string sql_F = &#34;Sel&#101;ct * FROM [{0}]&#34;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbConnection conn = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbDataAdapter da = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataTable tblSchema = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IList&lt;string&gt; tblNames = null;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化连接，并打开<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = new OleDbConnection(connStr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Open();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 获取数据源的表定义元数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//tblSchema = conn.GetSchema(&#34;Tables&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, &#34;TABLE&#34; });<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//GridView1.DataSource = tblSchema;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//GridView1.DataBind();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 关闭连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//conn.Close();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tblNames = new List&lt;string&gt;();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (DataRow row in tblSchema.Rows) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tblNames.Add((string)row[&#34;TABLE_NAME&#34;]); // 读取表名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化适配器<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;da = new OleDbDataAdapter();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 准备数据，导入DataSet<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSet ds = new DataSet();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (string tblName in tblNames) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;da.Sel&#101;ctCommand = new OleDbCommand(String.Format(sql_F, tblName), conn);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;da.Fill(ds, tblName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 关闭连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (conn.State == ConnectionState.Open) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 关闭连接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (conn.State == ConnectionState.Open) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 对导入DataSet的每张sheet进行处理&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 这里仅做显示<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView1.DataSource = ds.Tables[0];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView1.DataBind();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView2.DataSource = ds.Tables[1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GridView2.DataBind();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// more codes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// .<br/><br/>这里我们就不需要对SELEC 语句进行“硬编码”，可以根据需要动态的构造FROM 字句的“表名”。<br/><br/>不仅可以，获取表明，还可以获取每张表内的字段名、字段类型等信息：<br/><br/><br/>tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, null, null });<br/><br/>在ADO.nET 1.x 时候只有OleDb提供了GetOleDbSchemaTable 方法，而SqlClient或者OrcaleClient没有对应的方法，因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问，比如对于Sql Server：<br/><br/>Sel&#101;ct *<br/>FROM Northwind.INFORMATION_SCHEMA.COLUMNS<br/>Wh&#101;re TABLE_NAME = N&#39;Customers&#39;<br/><br/><br/>而在ADO.NET 2.0中每个xxxConnenction都实现了基类System.Data.Common.DbConnection的 GetSchemal 方法<br/>来获取数据源的架构信息。]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=340</link>
			<title><![CDATA[打击中国盗版“windows xp 黑屏”的经典破解方法]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Resource]]></category>
			<pubDate>Tue,21 Oct 2008 08:46:33 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=340</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前一阵子,微软宣布即将推出“黑屏”的方法对中国盗版XP进行打击，此消息即引起电脑用户的热议。大家纷纷寻找能破解此一“黑屏”的补丁。<br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;随后，一些大论坛相继出现题为“微软反盗xp黑屏补丁已被破解”的网帖，网友警告微软称“想玩奉陪到底”，并在随后的帖子中给出了一网友的破解方法，此破解方法如下：<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、开始-运行-输入：REGEDIT后回车。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、左栏找到：<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HKEY_LOCAL_MACHINE_SOFTWARE_Microsoft_WindowsNT_CurrentVersion_Winlogon_Notify_WgaLogon，<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三、删除WgaLogon项即可。]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=339</link>
			<title><![CDATA[IT职场人，切不要一辈子靠技术生存 ]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Diary]]></category>
			<pubDate>Wed,08 Oct 2008 09:57:29 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=339</guid>
		<description><![CDATA[　　不管你是学习技术为了找工作还是创业，你都要对技术本身有个清醒的认识，在中国不会出现BILL GATES，因为，中国目前还不是十分的尊重技术人才，还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。<br/><br/>　　一。 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇，你千万更不要认为哪些从事市场开发，跑腿的人，没有前途。<br/><br/>　　不知道你是不是知道，咱们中国有相当大的一部分软件公司，他们的软件开发团队都小的可怜，甚至只有1-3个人，连一个项目小组都算不上，而这样的团队却要承担一个软件公司所有的软件开发任务，在软件上线和开发的关键阶段需要团队的成员没日没夜的加班，还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑，有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友，进行封闭开发，你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭，以让你节省出更多的时间来投入到工作中，让你一直在那种累了就休息，不累就立即工作的状态)<br/><br/>　　更可怕的是，会让你接触的人际关系非常单一，除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人，你的朋友圈子小且单一，甚至破坏你原有的爱情(想象一下，你在外地做现场开发2个月以上，却从没跟女友见过一面的话，你的女友是不是会对你呲牙裂嘴)。<br/><br/>　　也许你拿到了所谓的白领的工资，但你却从此失去享受生活的自由，如果你想做技术人员尤其是开发人员，我想你很快就会理解，你多么想在一个地方长期待一段时间，认识一些朋友，多一些生活时间的愿望。<br/><br/>　　比之于我们的生活和人际关系及工作，那些从事售前和市场开发的朋友，却有比我们多的多的工作之外的时间，甚至他们工作的时间有的时候是和生活的时间是可以兼顾的，他们可以通过市场开发，认识各个行业的人士，可以认识各种各样的朋友，他们比我们坦率说更有发财和发展的机会，只要他们跟我们一样勤奋。(有一种勤奋的普通人，如果给他换个地方，他马上会成为一个勤奋且出众的人。)<br/><br/>　　二。在学习技术的时候千万不要认为如果做到技术最强，就可以成为100%受尊重的人。<br/><br/>　　有一次一个人在面试项目经理的时候说了这么一段话：我只用最听话的人，按照我的要求做只要是听话就要，如果不听话不管他技术再好也不要。随后这个人得到了试用机会，如果没意外的话，他一定会是下一个项目经理的继任者。<br/><br/>　　朋友们你知道吗?不管你技术有多强，你也不可能自由的腾出时间象别人那样研究一下LINUX源码，甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码，写代码的含义就是都规定好，你按照规定写，你很快就会发现你昨天写的代码，跟今天写的代码有很多类似，等你写过一段时间的代码，你将领略：复制，拷贝，粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。<br/><br/>　　如果你幸运的能够听到市场人员的谈话，或是领导们的谈话，你会隐约觉得他们都在把技术人员当作编码的机器来看，你的价值并没有你想象的那么重要。而在你所在的团队内部，你可能正在为一个技术问题的讨论再跟同事搞内耗，因为他不服你，你也不服他，你们都认为自己的对，其实你们两个都对，而争论的目的就是为了在关键场合证明一下自己比对方技术好，比对方强。(在一个项目开发中，没有人愿意长期听别人的，总想换个位置领导别人。)<br/><br/>　　三。你更不要认为，如果我技术够好，我就自己创业，自己有创业的资本，因为自己是搞技术的。<br/><br/>　　如果你那样认为，真的是大错特错了，你可以做个调查在非技术人群中，没有几个人知道C#与JAVA的，更谈不上来欣赏你的技术是好还是不好。一句话，技术仅仅是一个工具，善于运用这个工具为别人干活的人，却往往不太擅长用这个工具来为自己创业，因为这是两个概念，训练的技能也是完全不同的。<br/><br/>　　创业最开始的时候，你的人际关系，你处理人际关系的能力，你对社会潜规则的认识，还有你明白不明白别人的心，你会不会说让人喜欢的话，还有你对自己所提供的服务的策划和推销等等，也许有一万，一百万个值得我们重视的问题，但你会发现技术却很少有可能包含在这一万或一百万之内，如果你创业到了一个快成功的阶段，你会这样告诉自己：我干吗要亲自做技术，我聘一个人不就行了，这时候你才真正会理解技术的作用，和你以前做技术人员的作用。<br/><br/>　　[小结]<br/><br/>　　基于上面的讨论，我奉劝那些学习技术的朋友，千万不要拿科举考试样的心态去学习技术,对技术的学习几近的痴迷，想掌握所有所有的技术，以让自己成为技术领域的权威和专家，以在必要的时候或是心里不畅快的时候到网上对着菜鸟说自己是前辈。<br/><br/>　　技术仅仅是一个工具，是你在人生一个阶段生存的工具，你可以一辈子喜欢他，但最好不要一辈子靠它生存。<br/><br/>　　掌握技术的唯一目的就是拿它找工作(如果你不想把技术当作你第二生命的话)，就是干活。所以你在学习的时候千万不要去做那些所谓的技术习题或是研究那些帽泡算法，最大数算法了，什么叫干活?<br/><br/>　　就是做一个东西让别人用，别人用了，可以提高他们的工作效率，想象吧，你做1万道技术习题有什么用?只会让人觉得酸腐，还是在学习的时候，多培养些自己务实的态度吧，比如研究一下当地市场目前有哪些软件公司用人，自己离他们的要求到底有多远，自己具体应该怎么做才可以达到他们的要求。等你分析完这些，你就会发现，找工作成功，技术的贡献率其实并没有你原来想象的那么高。<br/><br/>　　不管你是学习技术为了找工作还是创业，你都要对技术本身有个清醒的认识，在中国不会出现BILL GATES，因为，中国目前还不是十分的尊重技术人才，还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。(如果你不理解，一种可能是你目前仅仅从事过技术工作，你的朋友圈子里技术类的朋友占了大多数，一种可能是你还没有工作，但喜欢读比尔。盖茨的传记) ]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=338</link>
			<title><![CDATA[挺不错的辞职申请，共享一下。]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[Nonsense]]></category>
			<pubDate>Mon,29 Sep 2008 09:56:11 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=338</guid>
		<description><![CDATA[尊敬的公司领导：<br/>&nbsp;&nbsp;&nbsp;&nbsp;您好！首先感谢您在百忙之中抽出时间阅读我的辞职信。<br/>&nbsp;&nbsp;&nbsp;&nbsp;我是怀着十分复杂的心情写这封辞职信的。自我进入公司之后，由于您对我的关心、指导和信任，使我获得了很多机遇和挑战。经过这段时间在公司的工作，我在软件开发领域学到了很多知识，积累了一定的经验，对此我深表感激。<br/>&nbsp;&nbsp;&nbsp;&nbsp;由于我自身能力的不足，近期的工作让我觉得力不从心。为此，我进行了长时间的思考，觉得公司目前的工作安排和我自己之前做的职业规划并不完全一致，而自己对一个新的领域也缺乏学习的兴趣。<br/>&nbsp;&nbsp;&nbsp;&nbsp;为了不因为我个人能力的原因而影响公司的项目开发进度，经过深思熟虑之后我决定辞去目前在公司和项目组所担任的职务和工作。我知道这个过程会给您带来一定程度上的不便，对此我深表抱歉。<br/>&nbsp;&nbsp;&nbsp;&nbsp;我已准备好在下周一从公司离职，并且在这段时间里完成工作交接，以减少因我的离职而给公司带来的不便。<br/>&nbsp;&nbsp;&nbsp;&nbsp;为了尽量减少对现有工作造成的影响，我请求在公司的员工通讯录上保留我的电子信箱和手机号码1个月，在此期间，如果有同事对我以前的开发工作有任何疑问，我将及时做出答复。<br/>&nbsp;&nbsp;&nbsp;&nbsp;非常感谢您在这段时间里对我的教导和照顾。在公司的这段经历于我而言非常珍贵。将来无论什么时候，我都会为自己曾经是公司的一员而感到荣幸。我确信在公司的这段工作经历将是我整个职业生涯发展中相当重要的一部分。<br/>&nbsp;&nbsp;&nbsp;&nbsp;祝公司领导和所有同事身体健康、工作顺利！<br/>&nbsp;&nbsp;&nbsp;&nbsp;再次对我的离职给公司带来的不便表示抱歉，同时我也希望公司能够体恤我的个人实际，对我的申请予以考虑并批准。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;此致<br/><br/>敬礼 <br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.stdns.net/article.asp?id=337</link>
			<title><![CDATA[ASP.NET异步请求处理(Asynchronous Http Handlers) ]]></title>
			<author>webmaster@stdns.net(月亮太阳)</author>
			<category><![CDATA[OOP]]></category>
			<pubDate>Thu,04 Sep 2008 20:55:36 +0800</pubDate>
			<guid>http://blog.stdns.net/default.asp?id=337</guid>
		<description><![CDATA[ASP.NET中你可以通过继承IHttpHandler这个接口来实现一个同步(Synchronous)处理用户请求的类。比如你希望对于一切类型为fakephp的请求都通过你的Http Hanlder来处理，你可以实现以下这个类：<br/><br/>using System;<br/>using System.Web;<br/>public class FakePHPHttpHandler : IHttpHandler {<br/>public void ProcessRequest(HttpContext context) {<br/>//let&#39;s pretend we can handle PHP stuff<br/>}<br/>public bool IsReusable {<br/>get { return true; }<br/>}<br/>}<br/><br/>然后通过在IIS里将你的dll注册为.fakephp的handler就可以了。这些在以下的MSDN文档里都有介绍：<br/><br/><a href="http://msdn2.microsoft.com/en-us/library/system.web.ihttphandler.aspx" target="_blank" rel="external">http://msdn2.microsoft.com/en-us/library/system.web.ihttphandler.aspx</a> <br/><br/>这里想说的是如何实现一个异步(Asynchronous)d的HTTP Handler。说起来其实也简单，只要实现IHttpAsyncHandler这个接口就好了。<br/><br/>IHttpAsyncHandler有两个method： <br/><br/>Public method BeginProcessRequest<br/>Initiates an asynchronous call to the HTTP handler.<br/><br/>Public method EndProcessRequest<br/>Provides an asynchronous process End method when the process ends.<br/><br/> <br/><br/>这显然是和.NET Framework中标准的Asynchronous Programming Model (或者叫“异步模式”， Asynchronous Pattern)是一致的：<br/><br/>参考: Asynchronous Programming Overview<br/><br/>异步模式的优势是ASP.NET的worker thread不会等待BeginProcessRequest返回而是会掉头去接收其他的用户请求（当然你也可以要求worker thread等待，不过这样就等于变成了Synchronous Handler）。因为通常处理一个web request的后台时间需要比较长。假设你每秒只能处理10个用户请求，在同步模式下如果有11个人同时访问你的服务，就有一个人会看到500 Internal Server Error之类的错误消息了。但如果是异步模式，worker thread只要调用BeignProcessRequest，而根据Asynchronous Programming Overview，BeignProcessRequest 应该立刻返回（“立刻”的含义是它不应该进行长时间的操作，而应该调用QueueUserWorkItem之类的API将耗时的任务放到新线程里执行），这样worker thread就可以腾出手去接收下一个user request了。<br/><br/>由此引出的问题自然是：当异步操作完成时， ASP.NET是如何知道并做相应处理的。这有一下几种选择：<br/><br/>1) 当调用BeginProcessRequest的时候，ASP.NET可以同时传入一个AsyncCallback的delegate，而在你完成异步操作后，你应该调用这个回调函数来通知ASP.NET。<br/><br/>2) ASP.NET可以不停地查看IAsyncResult (这个是BeginProcessRequest的返回值)IsCompleted属性来确认异步操作是否已经完成了，当然，当你完成异步操作时，你有义务将IsCompleted设成true。<br/><br/>3) ASP.NET也可以等待AsyncWaitHandle的信号，AsyncWaitHandle死IAsyncResult的另一个属性，这个和经典的Win32里waiting on kernel object时类似的。<br/><br/>4) ASP.NET可以直接调用EndProcessRequest。<br/><br/>注意：3) 和 4) 是Asynchronous Programming Overview里规定的标准的blocking execution的方式，也就是说，如果你的主线程在异步操作完成前无法再做任何工作时，它可以通过3) 或者 4)来等待异步操作的完成。<br/><br/>从理论上来说，你应该保证你的IHttpAsyncHandler能满足以上所有4种方式。但现实中，你未必一定如此做。那么哪些是我们必须实现以匹配ASP.NET的要求的呢？或者ASP.NET究竟是如何实现异步调用及返回的呢？<br/><br/>事实上，ASP.NET采用了方法1，也就是说，在调用BeignProcessRequest的时候，ASP.NET传入了一个 AsyncCallback，而你应该在完成异步操作后调用这个callback，而在这个AsyncCallback里，ASP.NET又调用了你的 EndProcessRequest来做收尾工作。<br/><br/>根据上面的讨论，我们可以如下设计我们的Asynchronous Http Hanlder：<br/><br/> <br/><br/> <br/><br/>public class AsyncFakePHPHttpHandler : IHttpAsyncHandler<br/>{<br/>private void ProcessRequestCallback(object state)<br/>{<br/>AsyncResult async = (AsyncResult)state;<br/>// this is wh&#101;re the real work is done<br/>ProcessRequest(async.context);<br/>async.isCompleted = true;<br/>if (null != async.asyncCallback)<br/>async.asyncCallback(async);<br/>}<br/>public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback asyncCallback, object state)<br/>{<br/>AsyncResult async = new AsyncResult(context, asyncCallback, state);<br/>// if the callback is null, we can return immediately and let EndProcessRequest do all the job<br/>// if callback is not null, we will use our thread pool to execute the necessary asynchronous operations<br/>// what happens in ASP.NET is that the callback in NOT null, so QueueUserWorkItem will be used<br/>if (null != async.asyncCallback)<br/>threadPool.QueueUserWorkItem(ProcessRequestCallback, async);<br/>return async;<br/>}<br/>// this design also satisfies method 4), we implement it this way to follow the Asynchronous Pattern as much as we can<br/>public void EndProcessRequest(IAsyncResult result)<br/>{<br/>AsyncResult async = (AsyncResult)result;<br/>if (null == async.asyncCallback)<br/>ProcessRequest(async.context);<br/>}<br/>} <br/><br/>总结一下实现异步Http Handler的要点：<br/><br/>1) 所有在BeginProcessRequest中的耗时操作（比如IO什么的）都应该采用异步调用（比如BeingRead/EndRead）或者生成新的线程去执行。不错，你可以设计一个blocking BeginProcessRequest，没有人能阻止你这么做。But that&#39;s a BAD BAD idea.<br/><br/>2) 实现BeginProcessRequest/EndProcessRequest的目的是允许ASP.NET来异步调用你的Http Handler<br/><br/>3) 你应该创建一个实现IAsyncResult接口的类，在BeginProcessRequest中你会生成一个该类的实例并返回给ASP.NET（注意 BeginProcessRequest的返回值类型）。而根据Asynchronous Pattern，ASP.NET在调用EndProcessRequest的时候会把这个实例再传回给你，你可以用这个实例来判断你所执行的任务的当前状态。]]></description>
		</item>
		
</channel>
</rss>
