<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">.NET新手区_博客园|网站分类</title><subtitle type="text">代码改变世界</subtitle><id>http://feed.cnblogs.com/blog/sitecateogry/beginner/rss</id><updated>2012-05-30T05:39:31Z</updated><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cate/beginner/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/sitecateogry/beginner/rss"/><entry><id>http://www.cnblogs.com/rohelm/archive/2012/05/30/2525010.html</id><title type="text">前线解释多线程《二》</title><summary type="text"/><published>2012-05-29T23:51:00Z</published><updated>2012-05-29T23:51:00Z</updated><author><name>谢舸哥</name><uri>http://www.cnblogs.com/rohelm/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rohelm/archive/2012/05/30/2525010.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rohelm/archive/2012/05/30/2525010.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 宋体; color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;接着前一篇博文的内容我们开始学习线程的同步和异步相关的内容，很多自学的新手同学可能精力的回避这个问题，其实很简单的，下面先给那些不理解这个概念的同学讲两个关于&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;的故事，听完了，你就明白实战出真理的道理了（如果新手从本文中略有所获就支持一下同样是新手的偶，给我个信息知道我没耽误你的时间，当然大家可以给我点建设性的意见和指导）。&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #ffff00; font-size: 18pt; background-color: #3366ff;"&gt;什么是线程同步？&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;从前某人混社会的时候，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;第一次去江湖厮杀，结果马上就遇到了地头蛇，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;靠被砍的很惨，连掏手机打个电话的机会都不给我，这时候有两条路给我选择，要吗掏手机命没了，要吗继续扛着结果手机没法掏出来，于是&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;发挥了珍惜生命的优良传统，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;就硬是扛到最后。你现在明白我在干什么了，呵呵，这就是同步，就是说你在干一件事的时候不能去同时做别的事情，否则就会发生意外（那就是你把命掉了）。这就是线程同步的意义，假设多个线程同时访问一个资源，.NET的定义的线程优先级还要看操作系统的心情，人家爱理不理，此外就是你应该有这么一个概念：Win32线程调度程序和CLR允许线程可以自由的跨越应用程序域的边界，但是任何一个时间点上，任何应用程序域上都可以有多个线程，但是一个线程只能在一个特定的应用程序域内，也就是说一个线程在任何时刻在多个应用程序域内是不可能同时执行的。很经典的例子就是那个啥，假设你不用多线程你使用Winfrom在其中运行一个超大循环的时候，（我发挥我高超的美术功底画了个了画演示一下）（这个程序虽然简单但是涉及一个跨线程访问的问题，如果有时间就到后面的博文拿出来分析一下）。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/360406/2012053003220666.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;你再去拖动程序窗体，结果你发现你力气没window力气大，而且还吃了没文化的亏，因为这个循环的执行和你这个托这个动作都是出于同一个线程（主线程中），同时干这两件事，如果你乱来，就算拖动了，他也就崩溃了，哈哈，现在明白了吧，这就是同步。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 宋体; color: #ffff00; background-color: #3366ff; font-size: 18pt;"&gt;&lt;strong&gt;现在我们解释什么是异步！&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;经过第一次的教训出去的时候&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;带了给小弟，结果还是更背，这次遇到了古惑仔，但是&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;在招架的时候给小弟用嘴说你快打电话给老子搬救兵，最少三卡车，结果，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;没有自己掏电话，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;只是用特定的信息告诉小弟，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;继续干我的事，搬救兵的事小弟就替我办了，结果这次&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;没有吃亏，还是&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;在小学学好了统筹学，同样的时间，办了几件事，还是小弟听话，&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;某人&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;自豪的笑了。多说无益，怕兄弟们烦，这就是异步操作，ajax的异步机制就是这样了，可以实现网页的局部更新等等......就不扯到asp.net上了，现在你应该明白了什么是异步了吧。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;我在这系列博文中不打算提到线程的优先级以及线程状态，这些大家就自己看吧，毕竟是次要的内容，瞄一眼就懂了。&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;.NET提供了两种方法可以实现同步，就是简单方法和高级方法，这就废话了，哈哈，对了据说.NET1.0还支持跨进程访问线程的，后还就给禁止掉了，不过现在还是可以通过取消跨进程访问的某个属性可以解除这种不安全的访问手段，靠又扯远了。&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;继续，简单方法就是轮询和等待，高级方法就是使用同步对象。&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-size: 18pt; color: #ffff00; background-color: #3366ff;"&gt;什么是轮询？&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;　&lt;span style="color: #000000;"&gt;　轮询其实效率低的都没人去用它，它的原理就是循环的去侦听线程的状态，而且就算侦听到了都有可能误判，假设砸门使用IsAlive来检测某个线程是否退出的时候我们要有这么个概念处于活动状态的线程不一定是运行的，就是说他亦可能出于休眠状态。&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-size: 18pt; background-color: #3366ff; color: #ffff00;"&gt;什么又是等待？&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;所谓的等待，懂汉语的孩子都知道就是等着某个对象办事情了，这个我在前面的一篇博文用到的很多，那就是Join，同样，好多小弟弟们搞不明白Join到底是啥，好多文章加了那么个调用线程#￥%&amp;hellip;&amp;hellip;的概念就把孩子们搞晕了，看群里搞晕的小弟弟还是蛮多的，其实你管那么多干嘛，试验下不就知道了，下面由于我在前面的博文中已经大量使用Join了，这里就不演示了，最要给个通俗的解释就是那个线程执行了Join方法，那么其他的线程都必须等待到该线程执行完为止才会有反应，但是我在这里再补充一下，就是这个&amp;ldquo;执行完&amp;rdquo;也是相对的，就是在该线程的执行过程中万一有调用了Sleep（）方法休眠了一下，那么别的线程管你还有没有执行完，当然既然是简单问题肯定只能解决简单的逻辑，要是流程一复杂，你就找比尔盖兹的工程师给你用Join给你解决线程同步的问题吧^@^!CPU就会把时间片分给别的线程去执行他们的任务，直到这个线程再次唤醒为止。具体的实例可以看上一篇文章。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="background-color: #3366ff; color: #ffff00; font-size: 18pt;"&gt;演示并发&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;　&lt;span style="color: #000000;"&gt;　说了这么久，我们干脆先演示下并发的程序，来分析下并发产生的问题，在进入下文介绍解决并发的高级方法。&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;先在有这么一点代码，先贴出来咱们在分析。&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Threading;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Printer&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; PrintNumbers() &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;            { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;          &lt;br/&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt;               &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;              { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;                 Random r = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Random(); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;                 Thread.Sleep(&lt;span style="color: #800080;"&gt;500&lt;/span&gt; * r.Next(&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;)); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;                 Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, i); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;              } &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;              Console.WriteLine(); &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;             Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*****线程同步 *****\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;             Printer p = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Printer();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;br/&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;             Thread[] threads = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;                 threads[i] =&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ThreadStart(p.PrintNumbers));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;                 threads[i].Name = &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;工作线程 thread #{0}启动执行！&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, i);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;                Console.WriteLine(threads[i].Name);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (Thread t &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; threads)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;                t.Start();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;            Console.ReadLine();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="font-family: 仿宋; font-size: 14pt; color: #000000;"&gt;&lt;strong&gt;乍一看，咋们肯定知道要是按正常的运行，肯定是每次循环输出10个数字，但是结果并非我们一厢情愿，我们运行看一下：（注：由于使用随机函数这个结果只是其中一种）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/360406/2012053003595072.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 仿宋; font-size: 14pt; color: #000000;"&gt;&lt;strong&gt;结果我们发现结果不是我们预料大的，毛呀，这是肿么了，有木有搞错啊，为什么会这样？&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #000000;"&gt;threads[i] =new Thread(new ThreadStart(p.PrintNumbers));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;　&lt;strong&gt;　&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;我们来看这一句代码，我们发现每一个线程都是调用同一个对象p的PrintNumbers方法，或许这只是个线索而已，&lt;/span&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;&lt;br /&gt;接着我们再看这句：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 宋体; color: #000000;"&gt;Thread.Sleep(500 * r.Next(3&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 14pt; font-family: 宋体;"&gt;&lt;span style="color: #000000;"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;我们就会发现，这里随机挂起线程的时间不能确定 ，可能的情况就是当即将发生printNumbers方法的时候，还没等输出&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;到控制台，当前的线程就被挂起了，win32的线程调度程序就切换线程，于是就发生了我们不可预料的结果。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;怎么解决了，哈哈是不是想用上面的上面的Join一下啊，完全可以有什么不可以的，咋们试试先，不过我们要引入高级方法，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;又要用低级方法验证一下，可不可以，我们的思路是什么呢：就是要线程调度程序等到哥执行完了当前线程再去执行下一个线&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;程，稍加修改代码我们测试一下，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;我们只在这里动一下手脚：&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (Thread t &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; threads)&lt;br/&gt;            {&lt;br/&gt;                t.Start();&lt;br/&gt;                t.Join();&lt;br/&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;但是结果就立马不同了，因为我们都知道每个线程都执行完成了，结果如你所愿：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/360406/2012053004222940.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;&lt;br /&gt;&lt;span style="color: #ffff00; font-size: 18pt; background-color: #3366ff;"&gt;那么怎么用高级方法解决这个问题呢？&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;我们为了节约时间先做一个最简单lock方法，这个其实是为了方便Monitor类的使用应用而生（完全等价于&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;Monitor类&lt;/span&gt;&lt;/strong&gt;的调用形式）。具体的后期再解释，咋们先只要知道高级方法解决这些问题，还是最优的选择就行了，先有个大概影响，后续博文慢慢研究。不可能一次都写完，我还要上课，还要去看电影，呵呵....&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;我们先解释下lock关键字，这个关键字允许定义一段线程定义的代码语句，后进入的线程不会中断当前的线程，而是如同实现Join类似的功能，停止自身的线程执行。lock需要指定一个标记（即一个对象的引用），你不指定，你锁了人家大门咋办，这个要注意O(&amp;cap;_&amp;cap;)O哈！当线程进入锁定范围的时候就需要获得这个标记，知道你家大门被锁了，进不去了，那就等等呗。&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;当然，如果我们去锁定一个实例对象的私有方法的时候，这个方法只有你这个对象可以访问，那么这个对象的引用（也就是标记）使用方法本身的对象引用就OK了，简单点就是this.锁定的就是你自家的门啦。。。&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;  &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; SomePrivateMethod() &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;          { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;           &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用当前对象为锁定标记&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;            { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这个语句块（范围）中的代码是线程安全的 &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;             } &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;8&lt;/span&gt;           } &lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;span style="font-family: 仿宋; font-size: 14pt;"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; 问题是我们有个锁子不一定所的都是自家的大门，指不定你就是个看大门的，哈哈。这样问题就来了，如果锁定公共成员中的一段代码，.NET推荐的方式就是使用&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 仿宋; font-size: 14pt; color: #000000;"&gt;&lt;strong&gt;Object成原来作为锁标记，所谓的标记你别看的那么神圣，那就是个ID而已，就是用来唯一识别的而已，不要深究这个问题。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Object myLock=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Object();   &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; PrintNumbers() &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;   { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用Object成员作为锁标记&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt;      &lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( myLock) &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;     { &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;        ... &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;     } &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;   } &lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; } &lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family: 仿宋; font-size: 14pt; color: #000000;"&gt;&lt;strong&gt;好了，当我们了解完这些我们就开始解决上面的那个问题，我们分析，每次循环的线程挂起和控制台输出的部分有可能出问题，OK，那我们把它锁起来，于是我们这样做了：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt;  &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; myLock=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; PrintNumbers()&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt;             Random r = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Random();&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt; (myLock)&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;                 Thread.Sleep(&lt;span style="color: #800080;"&gt;500&lt;/span&gt; * r.Next(&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;                 Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, i);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;         Console.WriteLine();&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; color: #000000; font-family: 宋体;"&gt;我们运行看下效果：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/360406/2012053004535086.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋;"&gt;事实证明我们成功的掌握了基本的解决多线程并发的一点点知识&lt;/span&gt;&lt;/strong&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="font-family: 仿宋; font-size: 14pt; color: #ffff00; background-color: #3366ff;"&gt;本篇博客结束语：&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-family: 仿宋; font-size: 14pt;"&gt;多线程虽然可以发挥我们多核电脑的优势，即便是俺曾经用过的那台02年单核的邵阳笔记本也是支持超线程的，但是不是任何时候都可以用多线程，就好比&lt;/span&gt;&lt;span style="font-family: 仿宋; font-size: 14pt;"&gt;再贵的法拉利你在我们这里的山村里你也飙不起来，但是要是让我开着拖拉机上了高速公路跑是可以跑，就是都遭人围观，于是有生之年哥决定要开个悍马，&lt;span style="font-family: 仿宋; font-size: 14pt;"&gt;高速&lt;/span&gt;山村都能&lt;/span&gt;&lt;span style="font-family: 仿宋; font-size: 14pt;"&gt;爽爽的跑上那么一会！！开玩笑，意思就是，不一定多核了你访问的资源就多了，看情况决定使用多线程这才是正确的决定。&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; font-family: 仿宋; background-color: #3366ff; color: #ffff00;"&gt;如果我在写博客的过程中帮到了你，就支持自学的孩子们包括我一下！&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rohelm/aggbug/2525010.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rohelm/archive/2012/05/30/2525010.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/29/2524910.html</id><title type="text">C#读取计算机CPU,HDD信息</title><summary type="text"/><published>2012-05-29T15:27:00Z</published><updated>2012-05-29T15:27:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/29/2524910.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/29/2524910.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string getCpuInfo()&amp;nbsp;//读取CPU信息&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementClass mobj = new ManagementClass("Win32_Processor");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementObjectCollection moc = mobj.GetInstances();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (ManagementObject mo in moc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mo.Properties["ProcessorId"].Value.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string getHddInfo()&amp;nbsp;//读取硬盘信息&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementClass mobj = new ManagementClass("Win32_PhysicalMedia");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManagementObjectCollection moc = mobj.GetInstances();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (ManagementObject mo in moc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mo.Properties["SerialNumber"].Value.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2524910.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/29/2524910.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/29/2524607.html</id><title type="text">ico图标的应用</title><summary type="text"/><published>2012-05-29T13:15:00Z</published><updated>2012-05-29T13:15:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/29/2524607.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/29/2524607.html"/><content type="html">&lt;p&gt;地址栏图标&lt;/p&gt;&lt;p&gt;&amp;lt;link rel="Shortcut Icon" href="Favicon.ico"&amp;gt;&lt;/p&gt;&lt;p&gt;收藏栏图标&lt;/p&gt;&lt;p&gt;&amp;lt;link rel="Bookmark" href="Favicon.ico"&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2524607.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/29/2524607.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/29/2523825.html</id><title type="text">实现记住用户登陆名</title><summary type="text"/><published>2012-05-29T05:27:00Z</published><updated>2012-05-29T05:27:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523825.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523825.html"/><content type="html">&lt;p&gt;.aspx文件中&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;&amp;hellip;&lt;br/&gt;&lt;/span&gt;&amp;lt;asp:TextBox ID=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;txtUser_Id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; MaxLength=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;4&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; Width=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;120px&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; BorderColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LightSlateGray&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; BorderWidth=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1px&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&amp;hellip;&lt;br/&gt;&lt;/span&gt;&amp;lt;asp:ImageButton ID=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;btnInsert&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ImageUrl=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Images/Login.GIF&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; OnClick=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;btnInsert_Click&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&amp;hellip;&lt;br/&gt;&lt;/span&gt;&amp;lt;asp:CheckBox ID=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;cbxRemeberUser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; Text=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;记住用户名&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; Font-Size=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Small&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ForeColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;gray&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;/&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&amp;hellip;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;.aspx.cs文件中&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;IsPostBack)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.txtUser_Id.Focus();&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!Object.Equals(Request.Cookies[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;创建一个Cookie对象，实现记住用户名&lt;/span&gt;&lt;br/&gt;                HttpCookie readcookie = Request.Cookies[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.txtUser_Id.Text =&lt;span style="color: #000000;"&gt; readcookie.Value;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateCookie()&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;创建一个Cookie对象&lt;/span&gt;&lt;br/&gt;        HttpCookie cookie = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HttpCookie(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;判断Checkbox控件是否被选中&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.cbxRemeberUser.Checked)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将用户编号存储到创建的Cookie对象中&lt;/span&gt;&lt;br/&gt;            cookie.Value = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.txtUser_Id.Text;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取创建的Cookie对象的过期时间&lt;/span&gt;&lt;br/&gt;        cookie.Expires =&lt;span style="color: #000000;"&gt; DateTime.MaxValue;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将创建的Cookie对象添加到内部Cookie集合中&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        Response.AppendCookie(cookie);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; btnInsert_Click(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, ImageClickEventArgs e)&lt;br/&gt;    {&lt;br/&gt;&amp;hellip;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;.Equals(Request.Cookies[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br/&gt;        {&lt;br/&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调用自定义方法 CreateCookie()存储用户名&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;          CreateCookie();&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;           CreateCookie();&lt;br/&gt;        }&lt;br/&gt;&amp;hellip;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2523825.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/29/2523825.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/29/2523802.html</id><title type="text">后台引用Javascript和Css类</title><summary type="text"/><published>2012-05-29T05:07:00Z</published><updated>2012-05-29T05:07:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523802.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523802.html"/><content type="html">&lt;p&gt;通常在&amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;标签中引用Javascript和Css，但是也有特殊情况，需要在后台进行引用，在此&lt;/p&gt;&lt;p&gt;写一个后台引用Javascript和Css的类&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 添加JS脚本链接&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="page"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;页面&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="url"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;路径&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddJS(System.Web.UI.Page page, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; url)&lt;br/&gt;    {&lt;br/&gt;        HtmlGenericControl jsControl &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HtmlGenericControl(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        jsControl.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;type&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        jsControl.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;src&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, url);&lt;br/&gt;        page.Header.Controls.Add(jsControl);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 添加JS脚本内容&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="page"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;页面&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="content"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;脚本内容&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddScript(System.Web.UI.Page page, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; content)&lt;br/&gt;    {&lt;br/&gt;        HtmlGenericControl scriptControl &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HtmlGenericControl(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        scriptControl.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;type&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        scriptControl.InnerHtml &lt;/span&gt;=&lt;span style="color: #000000;"&gt; content;&lt;br/&gt;        page.Header.Controls.Add(scriptControl);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 添加CSS样式链接&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="page"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;页面&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="url"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;路径&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddCss(System.Web.UI.Page page, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; url)&lt;br/&gt;    {&lt;br/&gt;        HtmlLink link &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; HtmlLink();&lt;br/&gt;        link.Href &lt;/span&gt;=&lt;span style="color: #000000;"&gt; url;&lt;br/&gt;        link.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;rel&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;stylesheet&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        link.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;type&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/css&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        page.Header.Controls.Add(link);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 添加CSS样式内容&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="page"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;页面&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="content"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;样式内容&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddStyle(System.Web.UI.Page page, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; content)&lt;br/&gt;    {&lt;br/&gt;        HtmlGenericControl styleControl &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HtmlGenericControl(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        styleControl.Attributes.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;type&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/css&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        styleControl.InnerHtml &lt;/span&gt;=&lt;span style="color: #000000;"&gt; content;&lt;br/&gt;        page.Header.Controls.Add(styleControl);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 添加Meta标签&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="page"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;页面&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;HttpEquiv&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="content"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Meta内容&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddMeta(System.Web.UI.Page page, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; name, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; content)&lt;br/&gt;    {&lt;br/&gt;        HtmlMeta meta &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; HtmlMeta();&lt;br/&gt;        meta.HttpEquiv &lt;/span&gt;=&lt;span style="color: #000000;"&gt; name;&lt;br/&gt;        meta.Content &lt;/span&gt;=&lt;span style="color: #000000;"&gt; content;&lt;br/&gt;        page.Header.Controls.Add(meta);&lt;br/&gt;    } &lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2523802.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/29/2523802.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/29/2523678.html</id><title type="text">DataGrid和GridView单击背景变色双击颜色还原</title><summary type="text"/><published>2012-05-29T03:10:00Z</published><updated>2012-05-29T03:10:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523678.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523678.html"/><content type="html">&lt;p&gt;DataGrid中&lt;/p&gt;&lt;p&gt;首先我们假设.aspx文件中DataGrid的数据行的样式为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &amp;lt;AlternatingItemStyle BackColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;White&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ForeColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#284775&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br/&gt;        &amp;lt;ItemStyle BackColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#F7F6F3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ForeColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#333333&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;/div&gt;&lt;p&gt;则在DataGrid的ItemDataBound事件中添加如下代码即可&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==&lt;span style="color: #000000;"&gt; ListItemType.AlternatingItem)&lt;br/&gt;        {&lt;br/&gt;               e.Item.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;onClick&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:c=this.style.backgroundColor;this.style.background='#FFA500';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;  &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;current 粉蓝色 &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;--#6699ff 蓝色 #FFFF00 黄色 #FFFFE0 亮黄色&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Item.ItemType ==&lt;span style="color: #000000;"&gt; ListItemType.Item)&lt;br/&gt;            {&lt;br/&gt;                e.Item.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;onDblClick&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:this.style.background='#F7F6F3';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                e.Item.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;onDblClick&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:this.style.background='#FFFFFF';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }   &lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;GridView中&lt;/p&gt;&lt;p&gt;首先我们假设.aspx文件中GridView的数据行的样式为&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;   &amp;lt;AlternatingRowStyle BackColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;White&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ForeColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#284775&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br/&gt;   &amp;lt;RowStyle BackColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#F7F6F3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; ForeColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#333333&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;/&amp;gt;&lt;/div&gt;&lt;p&gt;则在GridView的RowDataBound事件中添加如下代码即可&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Row.RowType ==&lt;span style="color: #000000;"&gt; DataControlRowType.DataRow)&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            e.Row.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;onClick&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:c=this.style.backgroundColor;this.style.background='#FFA500';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Row.RowState ==&lt;span style="color: #000000;"&gt; DataControlRowState.Normal)&lt;br/&gt;            {&lt;br/&gt;                e.Row.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;onDblClick&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:this.style.background='#F7F6F3';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e.Row.RowState ==&lt;span style="color: #000000;"&gt; DataControlRowState.Alternate)&lt;br/&gt;            {&lt;br/&gt;                e.Row.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;onDblClick&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:this.style.background='White';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2523678.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/29/2523678.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html</id><title type="text">C# 方法 虚方法的调用浅谈</title><summary type="text"/><published>2012-05-29T01:37:00Z</published><updated>2012-05-29T01:37:00Z</updated><author><name>kdalan</name><uri>http://www.cnblogs.com/kdalan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html"/><content type="html">&lt;p&gt;我们在面试中经常碰到有关多态的问题，之前我也一直被此类问题所困扰，闹不清到底执行哪个方法。&lt;/p&gt;&lt;p&gt;先给出一道简单的面试题，大家猜猜看，输出是？&lt;/p&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('6699cd4f-52e5-4b65-a71f-5c8d10262a83')"&gt;&lt;div id="cnblogs_code_open_6699cd4f-52e5-4b65-a71f-5c8d10262a83" class="cnblogs_code_hide"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&amp;nbsp;A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;MethodF()&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A.F&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;MethodG()&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A.G&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&amp;nbsp;B&amp;nbsp;:&amp;nbsp;A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;MethodF()&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;B.F&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;MethodG()&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;B.G&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&amp;nbsp;Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B&amp;nbsp;b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;B();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A&amp;nbsp;a&amp;nbsp;=&amp;nbsp;b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a.MethodF();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b.MethodF();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a.MethodG();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b.MethodG();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;首先看一下虚方法的定义(MSDN)：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;若一个实例方法的声明中含有 virtual 修饰符，则称该方法为虚拟方法。若其中没有 virtual 修饰符，则称该方法为非虚拟方法。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;以上面题目Test类Main中代码为例，简单说一下CLR创建对象的过程都做了什么事情&lt;/p&gt;&lt;div&gt;&lt;p&gt;1)　首先，声明一个引用类型变量 b，它仅是一个引用，保存在线程的栈上，用于将来存放B对象的有效地址。此时 b 未指向任何有效的实例，值为null，相关代码为：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;B&amp;nbsp;b;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2)　接下来，通过&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;执行对象的创建，即：&lt;/p&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;b&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;B();&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;对象的实例保存在托管堆上，CLR在创建一个新对象的同时，还会创建它的&lt;strong&gt;类型对象&lt;/strong&gt;(如果类型对象不存在)。&lt;/div&gt;&lt;p&gt;&lt;strong&gt;对象实例&lt;/strong&gt;在堆中的内存包括实例字段、类型对象指针、同步索引块，类型对象指针指向类型对象。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;类型对象&lt;/strong&gt;在堆中分配的内存包括实例字段、类型对象指针、同步索引块、静态字段、方法表。&lt;/p&gt;&lt;div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3)　&amp;nbsp;A a = b; &amp;nbsp;这行代码首先声明一个类型为A的引用类型变量a，并将其实际地址指向b所指向的对象实例。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4) 　之后就是方法的调用，下面详细说一下C#中方法的调用：&lt;/p&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; a.MethodF();&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;当调用一个对象的方法时，会直接检查这个对象变量(a)的类型 ，找到堆中的类型对象，查看是否有该方法，没有则通过类型对象的类型对象指针向上回溯查找，直至找到，然后检查该方法是否为虚方法，如果非虚，直接调用，由于MethodF 方法是非虚的，因此直接调用输出A.F。&lt;/p&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; a.MethodG();&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果该方法为虚方法，即有&lt;span style="background-color: #ffffff; font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left; color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="background-color: #ffffff; font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left;"&gt;&lt;span style="color: #4d4d4d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;关键字，则根据对象变量(a)，去找到对象的实例类B，查找该类型对象中是否重新实现过该虚方法(&lt;span style="background-color: #ffffff; font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left; color: #0000ff;"&gt;override &lt;/span&gt;关键字)，如果有，OK执行，如果没有，向上检查其父类，直至找到然后执行，MethodG为虚方法，则会查找实例B，由于B中重写了MethodG，因此此处输出B.G&lt;span style="background-color: #ffffff; font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;通过上面的描述，开始的那道面试题，我们应该轻松可以得出输出，此处就不啰嗦了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一般考多态的面试题中&amp;nbsp;&lt;span style="background-color: #ffffff; font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left; color: #0000ff;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #0000ff; font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left;"&gt;override &lt;/span&gt;&amp;nbsp;几个关键字经常出现，&lt;span style="font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 26px; text-align: left; color: #0000ff; background-color: #ffffff;"&gt;new&lt;/span&gt; 关键字实现一个新的方法，同时隐藏基类的同名方法。&amp;nbsp;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/kdalan/aggbug/2523470.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/29/2523420.html</id><title type="text">常用正则表达式</title><summary type="text"/><published>2012-05-29T01:17:00Z</published><updated>2012-05-29T01:17:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523420.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/29/2523420.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;以下列出一些常用正则表达式---&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;匹配中文字符的正则表达式： [\u4e00-\u9fa5]&lt;br /&gt;评注：匹配中文令人头疼，有了这个表达式就好办了&lt;/p&gt;&lt;p&gt;匹配双字节字符(包括汉字在内)：[^\x00-\xff]&lt;br /&gt;评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）&lt;/p&gt;&lt;p&gt;匹配空白行的正则表达式：\n\s*\r&lt;br /&gt;评注：可以用来删除空白行&lt;/p&gt;&lt;p&gt;匹配HTML标记的正则表达式：&amp;lt;(\S*?)[^&amp;gt;]*&amp;gt;.*?&amp;lt;/\1&amp;gt;|&amp;lt;.*? /&amp;gt;&lt;br /&gt;评注：上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力&lt;/p&gt;&lt;p&gt;匹配首尾空白字符的正则表达式：^\s*|\s*$&lt;br /&gt;评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式&lt;/p&gt;&lt;p&gt;匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&lt;br /&gt;评注：表单验证时很实用&lt;/p&gt;&lt;p&gt;匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*&lt;br /&gt;评注：不是很完善但基本可以满足需求&lt;/p&gt;&lt;p&gt;匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$&lt;br /&gt;评注：表单验证时很实用&lt;/p&gt;&lt;p&gt;匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}&lt;br /&gt;评注：匹配形式如 0316-608888 或 010-88888888&lt;/p&gt;&lt;p&gt;匹配腾讯QQ号：[1-9][0-9]{4,}&lt;br /&gt;评注：腾讯QQ号从10000开始&lt;/p&gt;&lt;p&gt;匹配中国邮政编码：[1-9]\d{5}(?!\d)&lt;br /&gt;评注：中国邮政编码为6位数字&lt;/p&gt;&lt;p&gt;匹配身份证：\d{15}|\d{18}&lt;br /&gt;评注：中国的身份证为15位或18位&lt;/p&gt;&lt;p&gt;匹配ip地址：\d+\.\d+\.\d+\.\d+&lt;br /&gt;评注：提取ip地址时有用&lt;/p&gt;&lt;p&gt;匹配特定数字：&lt;br /&gt;^[1-9]\d*$　 　 //匹配正整数&lt;br /&gt;^-[1-9]\d*$ 　 //匹配负整数&lt;br /&gt;^-?[1-9]\d*$ //匹配整数&lt;br /&gt;^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）&lt;br /&gt;^-[1-9]\d*|0$ //匹配非正整数（负整数 + 0）&lt;br /&gt;^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数&lt;br /&gt;^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数&lt;br /&gt;^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数&lt;br /&gt;^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数（正浮点数 + 0）&lt;br /&gt;^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$//匹配非正浮点数（负浮点数 + 0）&lt;br /&gt;评注：处理大量数据时有用，具体应用时注意修正&lt;/p&gt;&lt;p&gt;匹配特定字符串：&lt;br /&gt;^[A-Za-z]+$//匹配由26个英文字母组成的字符串&lt;br /&gt;^[A-Z]+$//匹配由26个英文字母的大写组成的字符串&lt;br /&gt;^[a-z]+$//匹配由26个英文字母的小写组成的字符串&lt;br /&gt;^[A-Za-z0-9]+$//匹配由数字和26个英文字母组成的字符串&lt;br /&gt;^\w+$//匹配由数字、26个英文字母或者下划线组成的字符串&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;持续更新中...&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2523420.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/29/2523420.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/28/2522448.html</id><title type="text">更有效的文件下载功能</title><summary type="text"/><published>2012-05-28T12:56:00Z</published><updated>2012-05-28T12:56:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/28/2522448.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/28/2522448.html"/><content type="html">&lt;p&gt;1.普通下载：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;下载文件的路径&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; path=Server.MapPath(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;广告.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;下载文件的名称&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; filename = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;广告.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        System.IO.FileInfo toDownload &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO.FileInfo(path);&lt;br/&gt;        Response.Clear();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (System.IO.Path.GetExtension(filename) == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        ...{&lt;br/&gt;            Response.AddHeader(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Disposition&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;attachment;filename=NEW_&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; HttpUtility.UrlEncode(toDownload.Name));&lt;br/&gt;            Response.ContentType &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;application/x-zip-compressed&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            Response.TransmitFile(path);&lt;br/&gt;            Response.End();&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2.大文件分成小块下载：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;下载文件的路径&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; path = Server.MapPath(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;广告.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;下载文件的名称&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; filename = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;广告.jpg&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        System.IO.FileInfo toDownload &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO.FileInfo(path);&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (toDownload.Exists == &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; ChunkSize = &lt;span style="color: #800080;"&gt;10000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[ChunkSize];&lt;br/&gt;&lt;br/&gt;            Response.Clear();&lt;br/&gt;            System.IO.FileStream iStream &lt;/span&gt;=&lt;span style="color: #000000;"&gt; System.IO.File.OpenRead(path);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; dataLengthToRead =&lt;span style="color: #000000;"&gt; iStream.Length;&lt;br/&gt;            Response.ContentType &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;application/octet-stream&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            Response.AddHeader(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Content-Disposition&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;attachment; filename=new_&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; +&lt;span style="color: #000000;"&gt; HttpUtility.UrlEncode(toDownload.Name));&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (dataLengthToRead &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt; &amp;amp;&amp;amp;&lt;span style="color: #000000;"&gt; Response.IsClientConnected)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; lengthRead = iStream.Read(buffer, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Convert.ToInt32(ChunkSize));&lt;br/&gt;                Response.OutputStream.Write(buffer, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, lengthRead);&lt;br/&gt;                Response.Flush();&lt;br/&gt;                dataLengthToRead &lt;/span&gt;= dataLengthToRead -&lt;span style="color: #000000;"&gt; lengthRead;&lt;br/&gt;            }&lt;br/&gt;            Response.Close();&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2522448.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/28/2522448.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xyrhwxb/archive/2012/05/28/2522377.html</id><title type="text">javascript访问ACCESS数据库</title><summary type="text"/><published>2012-05-28T12:00:00Z</published><updated>2012-05-28T12:00:00Z</updated><author><name>鱼求雨</name><uri>http://www.cnblogs.com/xyrhwxb/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xyrhwxb/archive/2012/05/28/2522377.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xyrhwxb/archive/2012/05/28/2522377.html"/><content type="html">&lt;p&gt;今天下载了一本书，书上竟然有这么一个例子，是js访问数据库的。打开调试了一下，竟然真的能运行。&lt;/p&gt;&lt;p&gt;注意：解压后，其中的database.mdb文件要放在E盘根目录下。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;附件： &lt;a title="js访问ACCESS数据库" onclick="alert(&amp;quot;感谢下载&amp;quot;)" href="http://files.cnblogs.com/xyrhwxb/database.rar" target="_blank"&gt;&amp;nbsp;http://files.cnblogs.com/xyrhwxb/database.rar&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xyrhwxb/aggbug/2522377.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xyrhwxb/archive/2012/05/28/2522377.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/28/2521467.html</id><title type="text">生成验证码</title><summary type="text"/><published>2012-05-28T08:12:00Z</published><updated>2012-05-28T08:12:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/28/2521467.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/28/2521467.html"/><content type="html">&lt;p&gt;CheckCode.aspx页面其实什么也不用写&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;%@ Page Language=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C#&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;  CodeFile=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CheckCode.aspx.cs&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; Inherits=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ValidateCode&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; %&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;!DOCTYPE html PUBLIC &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-//W3C//DTD XHTML 1.1//EN&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br/&gt;&amp;lt;html xmlns=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://www.w3.org/1999/xhtml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br/&gt;&amp;lt;head runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br/&gt;    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&lt;br/&gt;    &amp;lt;form id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;form1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br/&gt;       &lt;br/&gt;    &amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;&lt;p&gt;CheckCode.aspx.cs页面代码，生成验证码的主要部分&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Configuration;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Security;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.UI;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.UI.WebControls;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.UI.WebControls.WebParts;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.UI.HtmlControls;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Drawing;&lt;br/&gt;&lt;br/&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ValidateCode : System.Web.UI.Page&lt;br/&gt; {&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, System.EventArgs e)&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.CreateCheckCodeImage(GenerateCheckCode());&lt;br/&gt;     }&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Web 窗体设计器生成的代码&lt;br/&gt;     &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnInit(EventArgs e)&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;br/&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;         InitializeComponent();&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.OnInit(e);&lt;br/&gt;     }&lt;br/&gt;  &lt;br/&gt;      &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 设计器支持所需的方法 - 不要使用代码编辑器修改&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 此方法的内容。&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; InitializeComponent()&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Load += &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.EventHandler(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Page_Load);&lt;br/&gt;     }&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenerateCheckCode()&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; number;&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; code;&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; checkCode =&lt;span style="color: #000000;"&gt; String.Empty;&lt;br/&gt;&lt;br/&gt;         System.Random random &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Random();&lt;br/&gt;&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;         {&lt;br/&gt;             number &lt;/span&gt;=&lt;span style="color: #000000;"&gt; random.Next();&lt;br/&gt;&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (number % &lt;span style="color: #800080;"&gt;2&lt;/span&gt; == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;                 code &lt;/span&gt;= (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;)(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;)(number % &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                 code &lt;/span&gt;= (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;)(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + (&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;)(number % &lt;span style="color: #800080;"&gt;26&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;&lt;br/&gt;             checkCode &lt;/span&gt;+=&lt;span style="color: #000000;"&gt; code.ToString();&lt;br/&gt;         }&lt;br/&gt;&lt;br/&gt;         Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CheckCodeImage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] =&lt;span style="color: #000000;"&gt; checkCode;&lt;br/&gt;&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; checkCode;&lt;br/&gt;     }&lt;br/&gt;&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; CreateCheckCodeImage(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; checkCode)&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (checkCode == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; || checkCode.Trim() ==&lt;span style="color: #000000;"&gt; String.Empty)&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;         System.Drawing.Bitmap image &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Drawing.Bitmap((&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)Math.Ceiling((checkCode.Length * &lt;span style="color: #800080;"&gt;12.5&lt;/span&gt;)), &lt;span style="color: #800080;"&gt;22&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;         Graphics g &lt;/span&gt;=&lt;span style="color: #000000;"&gt; Graphics.FromImage(image);&lt;br/&gt;&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;         {&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生成随机生成器&lt;/span&gt;&lt;br/&gt;             Random random = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Random();&lt;br/&gt;&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;清空图片背景色&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;             g.Clear(Color.White);&lt;br/&gt;&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;画图片的背景噪音线&lt;/span&gt;&lt;br/&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;25&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;             {&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x1 =&lt;span style="color: #000000;"&gt; random.Next(image.Width);&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x2 =&lt;span style="color: #000000;"&gt; random.Next(image.Width);&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y1 =&lt;span style="color: #000000;"&gt; random.Next(image.Height);&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y2 =&lt;span style="color: #000000;"&gt; random.Next(image.Height);&lt;br/&gt;&lt;br/&gt;                 g.DrawLine(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pen(Color.Silver), x1, y1, x2, y2);&lt;br/&gt;             }&lt;br/&gt;&lt;br/&gt;             Font font &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Drawing.Font(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Arial&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;12&lt;/span&gt;, (System.Drawing.FontStyle.Bold |&lt;span style="color: #000000;"&gt; System.Drawing.FontStyle.Italic));&lt;br/&gt;             System.Drawing.Drawing2D.LinearGradientBrush brush &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Drawing.Drawing2D.LinearGradientBrush(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Rectangle(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, image.Width, image.Height), Color.Blue, Color.DarkRed, &lt;span style="color: #800080;"&gt;1.2f&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;             g.DrawString(checkCode, font, brush, &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;画图片的前景噪音点&lt;/span&gt;&lt;br/&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;100&lt;/span&gt;; i++&lt;span style="color: #000000;"&gt;)&lt;br/&gt;             {&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x =&lt;span style="color: #000000;"&gt; random.Next(image.Width);&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y =&lt;span style="color: #000000;"&gt; random.Next(image.Height);&lt;br/&gt;&lt;br/&gt;                 image.SetPixel(x, y, Color.FromArgb(random.Next()));&lt;br/&gt;             }&lt;br/&gt;&lt;br/&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;画图片的边框线&lt;/span&gt;&lt;br/&gt;             g.DrawRectangle(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Pen(Color.Silver), &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, image.Width - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, image.Height - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;&lt;br/&gt;             System.IO.MemoryStream ms &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO.MemoryStream();&lt;br/&gt;             image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);&lt;br/&gt;             Response.ClearContent();&lt;br/&gt;             Response.ContentType &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;image/Gif&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;             Response.BinaryWrite(ms.ToArray());&lt;br/&gt;         }&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;         {&lt;br/&gt;             g.Dispose();&lt;br/&gt;             image.Dispose();&lt;br/&gt;         }&lt;br/&gt;     }&lt;br/&gt; }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;下一步我们来引用上面的生成验证码页面（太简单不多说）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;                       &amp;lt;asp:Label ID=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;labFlag&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; Text=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;br/&gt;                       &amp;lt;asp:TextBox ID=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;txtYz_Code&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; runat=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; MaxLength=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;5&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; Width=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;55px&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; BorderColor=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Gray&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; BorderWidth=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;1px&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br/&gt;                       &amp;lt;img title=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;看不清点击换一张&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; align=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;absMiddle&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; onclick=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;this.src=this.src+'?'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PassWord/CheckCode.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;后台判断&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (String.Compare(Session[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CheckCodeImage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString(), &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.txtYz_Code.Text.Trim().ToUpper(), &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;) != &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.labFlag.text = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;验证码错误，请输入正确的验证码。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2521467.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/28/2521467.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html</id><title type="text">创建Windows服务(Windows Services)N种方式总结</title><summary type="text"/><published>2012-05-28T07:38:00Z</published><updated>2012-05-28T07:38:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html"/><content type="html">&lt;p&gt;最近由于工作需要，写了一些windows服务程序，有一些经验，我现在总结写出来。&lt;br /&gt;目前我知道的创建创建Windows服务有3种方式:&lt;br /&gt;a.利用.net框架类ServiceBase&lt;br /&gt;b.利用组件Topshelf&lt;br /&gt;c.利用小工具instsrv和srvany&lt;/p&gt;&lt;p&gt;下面我利用这3种方式,分别做一个windows服务程序，程序功能就是每隔5秒往程序目录下记录日志:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;strong&gt;a.利用.net框架类ServiceBase&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:简单，兼容性好&lt;/span&gt;&lt;/p&gt;&lt;p&gt;通过继承.net框架类ServiceBase实现&lt;/p&gt;&lt;p&gt;第1步: 新建一个Windows服务&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Service1 : ServiceBase&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Service1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Timer ( &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br/&gt;            {&lt;br/&gt;                AutoReset &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Elapsed &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , ElapsedEventArgs e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnStart ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ ] args )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnStop ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Stop DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; , DateTime.Now ) +&lt;span style="color: #000000;"&gt; Environment.NewLine );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第2步: 添加Installer&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    [RunInstaller ( &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; )]&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Installer1 : System.Configuration.Install.Installer&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceInstaller serviceInstaller;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceProcessInstaller processInstaller;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Installer1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;&lt;br/&gt;            processInstaller &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceProcessInstaller ( );&lt;br/&gt;            serviceInstaller &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceInstaller ( );&lt;br/&gt;&lt;br/&gt;            processInstaller.Account &lt;/span&gt;=&lt;span style="color: #000000;"&gt; ServiceAccount.LocalSystem;&lt;br/&gt;            serviceInstaller.StartType &lt;/span&gt;=&lt;span style="color: #000000;"&gt; ServiceStartMode.Automatic;&lt;br/&gt;&lt;br/&gt;            serviceInstaller.ServiceName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;my_WindowsService&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            serviceInstaller.Description &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WindowsService_Description&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            serviceInstaller.DisplayName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WindowsService_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            Installers.Add ( serviceInstaller );&lt;br/&gt;            Installers.Add ( processInstaller );&lt;br/&gt;        }  &lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第3步:安装,卸载 &lt;br /&gt;Cmd命令&lt;br /&gt;installutil&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsService_test.exe&amp;nbsp; (安装Windows服务)&lt;br /&gt;installutil /u&amp;nbsp;&amp;nbsp; WindowsService_test.exe&amp;nbsp; (卸载Windows服务)&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/WindowsService_test.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;strong&gt;b.利用组件Topshelf&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:代码简单,开源组件,Windows服务可运行多个实例&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Topshelf是一个开源的跨平台的服务框架，支持Windows和Mono，只需要几行代码就可以构建一个很方便使用的服务. 官方网站:http://topshelf-project.com&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第1步:引用程序集TopShelf.dll和log4net.dll&lt;/p&gt;&lt;p&gt;第2步:创建一个服务类MyClass,里面包含两个方法Start和Stop,还包含一个定时器Timer,每隔5秒往文本文件中写入字符&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Directory.GetCurrentDirectory ( ) + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass ( )&lt;br/&gt;        {&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Timer ( &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br/&gt;            {&lt;br/&gt;                AutoReset &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Elapsed &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , ElapsedEventArgs e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Start ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stop ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Stop DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; , DateTime.Now ) +&lt;span style="color: #000000;"&gt; Environment.NewLine );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第3步:使用Topshelf宿主我们的服务，主要是Topshelf如何设置我们的服务的配置和启动和停止的时候的方法调用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ ] args )&lt;br/&gt;        {&lt;br/&gt;            HostFactory.Run ( x &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                x.Service&lt;/span&gt;&amp;lt;MyClass&amp;gt; ( ( s ) =&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                {&lt;br/&gt;                    s.SetServiceName ( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                    s.ConstructUsing ( name &lt;/span&gt;=&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass ( ) );&lt;br/&gt;                    s.WhenStarted ( ( t ) &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; t.Start ( ) );&lt;br/&gt;                    s.WhenStopped ( ( t ) &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; t.Stop ( ) );&lt;br/&gt;                } );&lt;br/&gt;&lt;br/&gt;                x.RunAsLocalSystem ( );&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务的描述&lt;/span&gt;&lt;br/&gt;                x.SetDescription ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_Description&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务的显示名称&lt;/span&gt;&lt;br/&gt;                x.SetDisplayName ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务名称&lt;/span&gt;&lt;br/&gt;                x.SetServiceName ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_ServiceName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;&lt;br/&gt;            } );&lt;br/&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第4步: cmd命令&lt;/p&gt;&lt;p&gt;ConsoleApp_Topshelf.exe&amp;nbsp; install&amp;nbsp;&amp;nbsp;&amp;nbsp; (安装Windows服务)&lt;/p&gt;&lt;p&gt;ConsoleApp_Topshelf.exe&amp;nbsp; uninstall&amp;nbsp; (卸载Windows服务)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/ConsoleApp_Topshelf.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;c.利用小工具instsrv和srvany &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:代码超级简单,WindowsForm程序即可,并支持程序交互(本人最喜欢的特点),好像不支持win7,支持xp win2003&lt;/span&gt;&lt;/p&gt;&lt;p&gt;首先介绍2个小工具:&lt;/p&gt;&lt;p&gt;instsrv.exe:用以安装和卸载可执行的服务&lt;/p&gt;&lt;p&gt;srvany.exe:用于将任何EXE程序作为Windows服务运行&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这2个工具都是是Microsoft Windows Resource Kits工具集的实用的小工具&amp;nbsp;&lt;/p&gt;&lt;p&gt;你可以通过下载并安装Microsoft Windows Resource Kits获得 &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=17657"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=17657&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第1步: 新建WindowsForm程序&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;   &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 : Form&lt;br/&gt;    {&lt;br/&gt;        Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Application.StartupPath + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Form1_Load ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer ( )&lt;br/&gt;            {&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Interval &lt;/span&gt;= &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Tick &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; _sender , EventArgs _e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; _timer_Tick ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotImplementedException ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; button1_Click ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            MessageBox.Show ( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第2步:安装,卸载&lt;/p&gt;&lt;p&gt;服务的安装步骤分5小步:&lt;/p&gt;&lt;p&gt;(1)打开CMD,输入以下内容，其中WindowsForms_WindowsService为你要创建的服务名称&lt;/p&gt;&lt;p&gt;格式:目录绝对路径\instsrv &amp;nbsp;WindowsForms_WindowsService&amp;nbsp; 目录绝对路径\srvany.exe&lt;/p&gt;&lt;p&gt;例如:&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\instsrv.exe &amp;nbsp;WindowsForms_WindowsService &amp;nbsp;D:\TempWork\win\Debug\srvany.exe&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(2)regedit打开注册表编辑器,找到以下目录&lt;/p&gt;&lt;p&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WindowsForms_WindowsService&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(3)鼠标右键单击WindowsForms_WindowsService，创建一个"项"，名称为"Parameters"&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(4)鼠标左键单击"Parameters",在右边点击鼠标右键，创建一个"字符串值"(REG_SZ)，名称为"Application"，数值数据里填写目录下可执行文件的绝对路径+文件名&lt;/p&gt;&lt;p&gt;例如:&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\WindowsFormsApplication_Exe.exe&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(5)打开services.msc服务控制面板，找到WindowsForms_WindowsService服务，鼠标右键-属性-登陆，勾选"允许服务与桌面交互"&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;启动服务,可以看到程序界面&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/732/2012052815265286.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;卸载服务&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\instsrv.exe WindowsForms_WindowsService REMOVE&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/WindowsFormsApplication_Exe.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aierong/aggbug/2521409.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wangshenhe/archive/2012/05/28/2521393.html</id><title type="text">VS隐藏的快捷键和小功能</title><summary type="text"/><published>2012-05-28T07:27:00Z</published><updated>2012-05-28T07:27:00Z</updated><author><name>SamWang</name><uri>http://www.cnblogs.com/wangshenhe/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wangshenhe/archive/2012/05/28/2521393.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wangshenhe/archive/2012/05/28/2521393.html"/><content type="html">&lt;ol&gt;&lt;li&gt;可将代码放入工具箱，类似控件使用。&lt;/li&gt;&lt;li&gt;Ctrl+Shift+V:剪贴板循环粘贴。&lt;/li&gt;&lt;li&gt;Ctrl+T:变换一个字符，即将字符后移。&lt;/li&gt;&lt;li&gt;Ctrl+Shift+T:变换一个词！例如：method("qwe","asd")&amp;nbsp; =&amp;gt; method("asd","qwe")&lt;/li&gt;&lt;li&gt;Ctrl+L:删除一行。&lt;/li&gt;&lt;li&gt;Alt+Shift+T:当前行下移。&lt;/li&gt;&lt;li&gt;Ctrl+K、Ctrl+F:格式化选中区域。&lt;/li&gt;&lt;li&gt;Ctrl+K、Ctrl+D:格式化整个文档。&lt;/li&gt;&lt;li&gt;Ctrl+J:调用智能提示。&lt;/li&gt;&lt;li&gt;Ctrl+Shift+Space：显示参数信息。&lt;/li&gt;&lt;li&gt;Ctrl+K、Ctrl+I：显示快速信息。&lt;/li&gt;&lt;li&gt;Alt+左键：列选择！&lt;/li&gt;&lt;li&gt;Ctrl+G:转到行。&lt;/li&gt;&lt;li&gt;Ctrl+I:递增查找下一个结果，即模糊查找。Ctrl+Shift+I：递增查找上一个结果。&lt;/li&gt;&lt;li&gt;F12：跳转到该方法的定义代码&lt;/li&gt;&lt;li&gt;Alt+Shift+Enter：全屏模式&lt;/li&gt;&lt;li&gt;Ctrl+Shift+C:类视图&lt;/li&gt;&lt;li&gt;右键&amp;ldquo;设置下一语句&amp;rdquo;：调试器强行跳转到该行，然后继续正常的调试工作。&lt;/li&gt;&lt;li&gt;Ctrl+Alt+I：即时窗口&lt;/li&gt;&lt;li&gt;Ctrl+Shift+D:代码定义窗口。&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/wangshenhe/aggbug/2521393.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wangshenhe/archive/2012/05/28/2521393.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/top5/archive/2012/05/28/2521091.html</id><title type="text">采集网页图片代码</title><summary type="text"/><published>2012-05-28T03:44:00Z</published><updated>2012-05-28T03:44:00Z</updated><author><name>与时俱进</name><uri>http://www.cnblogs.com/top5/</uri></author><link rel="alternate" href="http://www.cnblogs.com/top5/archive/2012/05/28/2521091.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/top5/archive/2012/05/28/2521091.html"/><content type="html">&lt;div&gt;采集网页上图片的主要关键是在怎么解析出页面代码里那些img标签的src属性，在网上找了下大多都是通过字符串操作找出img标签，这种方式操作起来比较麻烦，而且代码看起来比较累。这里我用的方法是通过WebBrowser来加载一个页面，然后HTMLDocument类来操作省去了字符串操作的步骤，直接调用GetElementsByTagName把所有图片地址返回到一个HtmlElementCollection对象里。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;代码如下：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;using System;&lt;/div&gt;&lt;div&gt;using System.Collections.Generic;&lt;/div&gt;&lt;div&gt;using System.Linq;&lt;/div&gt;&lt;div&gt;using System.Text;&lt;/div&gt;&lt;div&gt;using System.Text.RegularExpressions;&lt;/div&gt;&lt;div&gt;using System.Net;&lt;/div&gt;&lt;div&gt;using System.IO;&lt;/div&gt;&lt;div&gt;using System.Windows.Forms;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;namespace WindowsFormsApplication1&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; public class GatherPic&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private string savePath;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private string getUrl;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private WebBrowser wb;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private int iImgCount;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //初始化参数&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public GatherPic(string sWebUrl, string sSavePath)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.getUrl = sWebUrl;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.savePath = sSavePath;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //开始采集&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public bool start()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (getUrl.Trim().Equals(""))&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MessageBox.Show("哪来的虾米连网址都没输！");&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.wb = new WebBrowser();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.wb.Navigate(getUrl);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //委托事件&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.wb.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(DocumentCompleted);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //WebBrowser.DocumentCompleted委托事件&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //页面里框架iframe加载完成不掉用SearchImgList()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (e.Url != wb.Document.Url) return;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SearchImgList();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //检查出所有图片并采集到本地&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public void SearchImgList()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string sImgUrl;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //取得所有图片地址&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HtmlElementCollection elemColl = this.wb.Document.GetElementsByTagName("img");&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.iImgCount = elemColl.Count;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach (HtmlElement elem in elemColl)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sImgUrl = elem.GetAttribute("src");&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //调用保存远程图片函数&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SaveImageFromWeb(sImgUrl, this.savePath);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //保存远程图片函数&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public int SaveImageFromWeb(string imgUrl, string path)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string imgName = imgUrl.ToString().Substring(imgUrl.ToString().LastIndexOf("/") + 1);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; path = path + "\\" + imgName;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string defaultType = ".jpg";&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string[] imgTypes = new string[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string imgType = imgUrl.ToString().Substring(imgUrl.ToString().LastIndexOf("."));&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach (string it in imgTypes)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (imgType.ToLower().Equals(it))&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (it.Equals(".bmp"))&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; imgType = defaultType;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imgUrl);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; Natas.Robot)";&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.Timeout = 10000;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WebResponse response = request.GetResponse();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Stream stream = response.GetResponseStream();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (response.ContentType.ToLower().StartsWith("image/"))&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; byte[] arrayByte = new byte[1024];&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int imgLong = (int)response.ContentLength;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int l = 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // CreateDirectory(path);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FileStream fso = new FileStream(path, FileMode.Create);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (l &amp;lt; imgLong)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int i = stream.Read(arrayByte, 0, 1024);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fso.Write(arrayByte, 0, i);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; l += i;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fso.Close();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stream.Close();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response.Close();&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 1;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch (WebException)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch (UriFormatException)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;//-----------------调用代码--------------------&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;GatherPic gatherpic = new GatherPic(&amp;#8220;http://www.baidu.com&amp;#8221;,"C:\test");&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;//请确保c:\下存在test路径&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;gatherpic.start()&lt;/div&gt;&lt;img src="http://www.cnblogs.com/top5/aggbug/2521091.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/top5/archive/2012/05/28/2521091.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/52net/archive/2012/05/28/2521075.html</id><title type="text">Javascript网页刷新方法集锦（测试通过）</title><summary type="text"/><published>2012-05-28T03:36:00Z</published><updated>2012-05-28T03:36:00Z</updated><author><name>爱智旮旯</name><uri>http://www.cnblogs.com/52net/</uri></author><link rel="alternate" href="http://www.cnblogs.com/52net/archive/2012/05/28/2521075.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/52net/archive/2012/05/28/2521075.html"/><content type="html">&lt;p align="left"&gt;方法一：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&amp;lt;input type=button value=刷新 onclick="history.go(0)"&amp;gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;方法二：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&amp;lt;input type=button value=刷新 onclick="location.reload()"&amp;gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;方法三：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&amp;lt;input type=button value=刷新 onclick="location=location"&amp;gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;方法四：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&amp;lt;input type=button value=刷新 onclick="window.navigate(location)"&amp;gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;方法五：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&amp;lt;input type=button value=刷新 onclick="location.replace(location)"&amp;gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;方法六：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&amp;lt;input type=button value=刷新 onclick="document.execCommand('Refresh')" /&amp;gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;方法七：&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;lt;input type=button value=刷新 onclick="window.open('Default.aspx','_self')" /&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/52net/aggbug/2521075.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/52net/archive/2012/05/28/2521075.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/liuning8023/archive/2012/05/27/2520374.html</id><title type="text">NChain 0.1 项目&amp;mdash;&amp;mdash;但愿是根救命稻草</title><summary type="text"/><published>2012-05-27T09:29:00Z</published><updated>2012-05-27T09:29:00Z</updated><author><name>IGod接口</name><uri>http://www.cnblogs.com/liuning8023/</uri></author><link rel="alternate" href="http://www.cnblogs.com/liuning8023/archive/2012/05/27/2520374.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/liuning8023/archive/2012/05/27/2520374.html"/><content type="html">&lt;p&gt;&lt;strong&gt;本文内容&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;NChain 概述 &lt;/li&gt;    &lt;li&gt;NChain 架构 &lt;/li&gt;    &lt;li&gt;使用 NChain 演示 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;最近做个项目，有流程控制。也就是，执行一个流程，依赖该流程前面的流程……&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;比如，编写一个文档后，需要提交给二领导，二领导同意了，再由大领导审核，即 创建 –&amp;gt; 提交 –&amp;gt; 审核（提交或审核后，当然可以打回给创建或提交，也就是，二领导或大领导认为文档不妥）。但有时，看什么样文档，事不大的话，二领导全权处理就行了。或是，大领导很信任、肯定二领导的能力，交代一般事情你全权处理就好了，不用向我请示。&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;再比如，政府部门的审批，他们的审批流程每年都在变，因为政策变了。&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;现在，假设有流程 A –&amp;gt; B –&amp;gt; C –&amp;gt; D –&amp;gt; E –&amp;gt; F，从 A 可以任意跳流程（这仅仅是业务“跳”了，程序不会），也就是，A –&amp;gt; B，或 A –&amp;gt; C，或 A –&amp;gt; F，或 B –&amp;gt; D 等等。&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;起初，不想搞得太复杂，但写着写着发现，目前的结构耦合得太紧，更要命是代码不易控制，调试也有困难——很困惑。想来想去，觉得改进成 NChain 的方式似乎可以解决我目前的困境。&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;下面是 NChain 的结构。&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NChain 概述&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Chain.NET（又称 NChain），是 &amp;quot;Chain Of Resposibility&amp;quot; (CoR) 职责链模式在 .NET 和 Mono 平台上的一个实现。&lt;/p&gt;  &lt;p&gt;这个库的概念来自于 Java 平台的 &lt;a href="http://commons.apache.org/chain/" target="_blank"&gt;Jakarta's Commons Chain&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;Chain.NET 解决方案把标准的职责链模式（CoR design pattern ）与命令模式（Command design pattern ）相结合，以方便灵活地处理命令。&lt;/p&gt;  &lt;p&gt;Chain.NET 库提供了适当接口，用来扩展标准的 CoR。&lt;/p&gt;  &lt;p&gt;Chain.NET 可以做到如下几个方面：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;试想，若将对业务实体（可以是接口，可以是类，一般是抽象类/基类）的处理看成命令，抽象成处理单元。命令描述自己如何处理以及能处理哪些业务实体。&lt;/li&gt;    &lt;li&gt;对一个业务实体，可以执行多个命令。也就是，将形成一条命令链，将业务实体传递给这个链，这样业务实体就会经过链中所有命令的处理。&lt;/li&gt;    &lt;li&gt;当其中一个命令执行失败后，链会从当前一个命令的前一个命令开始回退，也就是撤销之前所有命令对业务实体的处理。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;这样，如上所示，流程 A –&amp;gt; B –&amp;gt; C –&amp;gt; D –&amp;gt; E –&amp;gt; F，以及业务 object，是经过 A –&amp;gt; B，还是 B –&amp;gt; D，构造你的链就行。这就是自动化流程。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NChain 架构&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;接口&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Chain.NET 库里有几个基本接口，可以实现标准的 CoR 模式。如下：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ICommand &lt;/li&gt;    &lt;li&gt;IFilter &lt;/li&gt;    &lt;li&gt;IChain &lt;/li&gt;    &lt;li&gt;IContext &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;ICommand&lt;/em&gt;&lt;/strong&gt; 接口表示执行的（考虑要完成特定的执行状态）工作单元。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;IFilter&lt;/em&gt;&lt;/strong&gt; 接口通过 &lt;strong&gt;&lt;em&gt;postProcess&lt;/em&gt;&lt;/strong&gt; 方法扩展标准的 &lt;strong&gt;&lt;em&gt;ICommand&lt;/em&gt;&lt;/strong&gt;，该方法总是由 &lt;strong&gt;&lt;em&gt;IChain&lt;/em&gt;&lt;/strong&gt; 执行，当 &lt;strong&gt;&lt;em&gt;IFilter&lt;/em&gt;&lt;/strong&gt; 的 &lt;strong&gt;&lt;em&gt;execute&lt;/em&gt;&lt;/strong&gt; 方法执行完后执行。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IChain&lt;/strong&gt; 接口表示 &lt;strong&gt;&lt;em&gt;ICommand&lt;/em&gt;&lt;/strong&gt; 有序集合，需要处理特定的 &lt;strong&gt;&lt;em&gt;IContext&lt;/em&gt;&lt;/strong&gt;。它扩展标准的 &lt;strong&gt;&lt;em&gt;ICommand&lt;/em&gt;&lt;/strong&gt; 接口。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;IContext&lt;/em&gt;&lt;/strong&gt; 接口表示执行对 &lt;strong&gt;&lt;em&gt;command&lt;/em&gt;&lt;/strong&gt; 可用的上下文环境（状态信息）。在同一个 &lt;strong&gt;&lt;em&gt;IChain&lt;/em&gt;&lt;/strong&gt; 的 &lt;strong&gt;&lt;em&gt;command&lt;/em&gt;&lt;/strong&gt;，可以重新抛出（把内部异常再抛出来）来互相通信，或返回执行结果。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;基类&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;&lt;strong&gt;ChainBase&lt;/strong&gt;&lt;/em&gt; 类——IChain 接口的基类实现 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;该类提供基本的“链”功能。通过把 context 传递给“链”中的 command，处理特定的 context。&lt;/p&gt;  &lt;p&gt;该类提供 &lt;strong&gt;&lt;em&gt;addCommand&lt;/em&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;em&gt;removeCommand&lt;/em&gt;&lt;/strong&gt; 方法添加新的 command 到 “链”和从“链”中删除 command。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;em&gt;ContextBase&lt;/em&gt;&lt;/strong&gt; 类——IContext 接口的基类实现 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;该类继承 &lt;strong&gt;&lt;em&gt;System.Collection.Hashtable&lt;/em&gt;&lt;/strong&gt; 类。提供标准的 context 功能。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;em&gt;CommandBase&lt;/em&gt;&lt;/strong&gt; 类 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;抽象的 &lt;strong&gt;&lt;em&gt;CommandBase&lt;/em&gt;&lt;/strong&gt; 类提供两个常量，用来标识命令的执行结果。&lt;/p&gt;  &lt;p&gt;对于“链”的 command，可以不继承该类。command 可以返回定义在该类中的常量（true/false），以标识执行状态。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/liuning8023/201205/201205271728552336.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="图 1 NChain 结构" border="0" alt="图 1 NChain 结构" src="http://images.cnblogs.com/cnblogs_com/liuning8023/201205/201205271728558159.jpg" width="768" height="347" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;图 1 NChain 结构&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使用 NChain 演示&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;下面是 &lt;strong&gt;&lt;em&gt;NChain&lt;/em&gt;&lt;/strong&gt; 单元测试 Demo 给出的一个演示。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;em&gt;TestCommandBase&lt;/em&gt;&lt;/strong&gt; 基类继承 &lt;strong&gt;&lt;em&gt;NChain&lt;/em&gt;&lt;/strong&gt; 的 &lt;strong&gt;&lt;em&gt;CommandBase&lt;/em&gt;&lt;/strong&gt; 基类。&lt;strong&gt;&lt;em&gt;TestCommandBase&lt;/em&gt;&lt;/strong&gt; 基类是单元测试中所有“命令”类和“后续处理命令”类（如 &lt;strong&gt;&lt;em&gt;SimpleAdderCommand&lt;/em&gt;&lt;/strong&gt;，&lt;strong&gt;&lt;em&gt;SimpleFilterForwardCommand&lt;/em&gt;&lt;/strong&gt; 等）的基类。 &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;TestFilterBase&lt;/em&gt;&lt;/strong&gt; 基类继承 &lt;em&gt;&lt;strong&gt;TestCommandBase &lt;/strong&gt;&lt;/em&gt;基类。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;直观上理解，这个演示规定了两种命令：命令和后续命令。如执行一个“命令”，却失败了，此时需要执行“后续命令”。如下 &lt;strong&gt;&lt;em&gt;ChainBase&lt;/em&gt;&lt;/strong&gt; 的 &lt;strong&gt;&lt;em&gt;execute&lt;/em&gt;&lt;/strong&gt; 方法的代码。&lt;/p&gt;  &lt;p&gt;“命令”的基类是 &lt;strong&gt;&lt;em&gt;TestCommandBase&lt;/em&gt;&lt;/strong&gt;，“后续命令”的基类为 &lt;strong&gt;&lt;em&gt;TestFilterBase&lt;/em&gt;&lt;/strong&gt;。“后续命令”也是“命令”，所以 &lt;strong&gt;&lt;em&gt;TestFilterBase&lt;/em&gt;&lt;/strong&gt; 要继承 &lt;strong&gt;&lt;em&gt;TestCommandBase&lt;/em&gt;&lt;/strong&gt;。&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; execute(IContext context)  {      &lt;span class="kwrd"&gt;if&lt;/span&gt; (context == &lt;span class="kwrd"&gt;null&lt;/span&gt;)      {          &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Context is null.&amp;quot;&lt;/span&gt;);      }  &amp;#160;      isFrozen = &lt;span class="kwrd"&gt;true&lt;/span&gt;;  &amp;#160;      &lt;span class="kwrd"&gt;bool&lt;/span&gt; savedResult = &lt;span class="kwrd"&gt;false&lt;/span&gt;;  &amp;#160;      Exception savedException = &lt;span class="kwrd"&gt;null&lt;/span&gt;;  &amp;#160;      &lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0;      &lt;span class="kwrd"&gt;int&lt;/span&gt; n = commandsList.Count;      &lt;span class="kwrd"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; n; i++)      {          &lt;span class="kwrd"&gt;try&lt;/span&gt;          {              savedResult = ((ICommand)commandsList[i]).execute(context);  &amp;#160;              &lt;span class="kwrd"&gt;if&lt;/span&gt; (savedResult)              {                  &lt;span class="kwrd"&gt;break&lt;/span&gt;;              }          }          &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)          {              savedException = e;              &lt;span class="kwrd"&gt;break&lt;/span&gt;;          }      }  &amp;#160;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (i == n)      {          i--;      }  &amp;#160;      &lt;span class="kwrd"&gt;bool&lt;/span&gt; isHandled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;  &amp;#160;      &lt;span class="kwrd"&gt;bool&lt;/span&gt; result = &lt;span class="kwrd"&gt;false&lt;/span&gt;;  &amp;#160;      &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = i; j &amp;gt;= 0; j--)      {          &lt;span class="kwrd"&gt;if&lt;/span&gt; (commandsList[j] &lt;span class="kwrd"&gt;is&lt;/span&gt; IFilter)          {              &lt;span class="kwrd"&gt;try&lt;/span&gt;              {                  result = ((IFilter)commandsList[j]).postProcess(context, savedException);  &amp;#160;                  &lt;span class="kwrd"&gt;if&lt;/span&gt; (result)                  {                      isHandled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;                  }              }              &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)              {                  &lt;span class="rem"&gt;// ignore exception during postprocessing&lt;/span&gt;              }          }      }  &amp;#160;      &lt;span class="rem"&gt;// Return the exception or result state from the last execute()&lt;/span&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; ((savedException != &lt;span class="kwrd"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; !isHandled)      {          &lt;span class="kwrd"&gt;throw&lt;/span&gt; savedException;      }      &lt;span class="kwrd"&gt;else&lt;/span&gt;      {          &lt;span class="kwrd"&gt;return&lt;/span&gt; (savedResult);      }  }&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;  &lt;p&gt;备注：&lt;/p&gt;  &lt;p&gt;若一个“链”有 &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt; 个命令，当执行到第 &lt;strong&gt;&lt;em&gt;i &lt;/em&gt;&lt;/strong&gt;个命令失败后（调用 &lt;strong&gt;&lt;em&gt;chain&lt;/em&gt;&lt;/strong&gt; 里第 &lt;strong&gt;&lt;em&gt;i&lt;/em&gt;&lt;/strong&gt; 个 &lt;em&gt;&lt;strong&gt;ICommand&lt;/strong&gt;&lt;/em&gt; 的 &lt;em&gt;&lt;strong&gt;exectue&lt;/strong&gt;&lt;/em&gt; 方法），就执行从&lt;strong&gt;&lt;em&gt; i&lt;/em&gt;&lt;/strong&gt; 到 &lt;strong&gt;&lt;em&gt;0&lt;/em&gt;&lt;/strong&gt;，将所有 &lt;strong&gt;&lt;em&gt;ICommand&lt;/em&gt;&lt;/strong&gt; 接口转换成 &lt;strong&gt;&lt;em&gt;IFilter&lt;/em&gt;&lt;/strong&gt; 接口，并执行其 &lt;em&gt;&lt;strong&gt;postProcess&lt;/strong&gt;&lt;/em&gt; 方法。&lt;/p&gt;  &lt;p&gt;相当于，执行一个命令失败后，撤销该命令。&lt;/p&gt;  &lt;p&gt;另外，上面代码还判断了 &lt;strong&gt;&lt;em&gt;ICommand&lt;/em&gt;&lt;/strong&gt; 是否属于 &lt;strong&gt;&lt;em&gt;IFilter&lt;/em&gt;&lt;/strong&gt;。若是，才进行转换，并执行 &lt;em&gt;&lt;strong&gt;postProcess&lt;/strong&gt;&lt;/em&gt; 方法。因为，不是所有的命令有其相应的撤销命令。比如数据库，DML 操作有事务，但 DDL 没有，也不需要。再比如操作系统，执行 delete 命令若失败，当然要撤销，可执行 dir 命令要是失败，就无所谓了。 &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;如图 2 所示，所有“命令”，包括“添加（&lt;strong&gt;&lt;em&gt;SimpleAdderCommand &lt;/em&gt;&lt;/strong&gt;类）”、“删除（&lt;strong&gt;&lt;em&gt;SimpleRemoverCommand &lt;/em&gt;&lt;/strong&gt;类）”、“向前（&lt;strong&gt;&lt;em&gt;SimpleForwardCommand &lt;/em&gt;&lt;/strong&gt;类）”、“完成（&lt;strong&gt;&lt;em&gt;SimpleCompletedCommand &lt;/em&gt;&lt;/strong&gt;类）”、“异常（&lt;strong&gt;&lt;em&gt;SimpleExceptionCommand&lt;/em&gt;&lt;/strong&gt; 类）”都继承 &lt;strong&gt;&lt;em&gt;TestCommandBase &lt;/em&gt;&lt;/strong&gt;基类。每个类都有 &lt;strong&gt;&lt;em&gt;execute&lt;/em&gt;&lt;/strong&gt; 方法。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/liuning8023/201205/201205272303582019.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="图 2 命令类的类图 " border="0" alt="图 2 命令类的类图 " src="http://images.cnblogs.com/cnblogs_com/liuning8023/201205/201205272303591114.jpg" width="678" height="268" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;strong&gt;图 2 命令类的类图 &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如图 3 所示，所有“后续处理命令”，包括“向前（&lt;strong&gt;&lt;em&gt;SimpleFilterForwardCommand&lt;/em&gt;&lt;/strong&gt; 类）”、“完成（&lt;strong&gt;&lt;em&gt;SimpleFilterCompleteCommand&lt;/em&gt;&lt;/strong&gt; 类）”和“异常（&lt;strong&gt;&lt;em&gt;SimpleFilterExceptionCommand&lt;/em&gt;&lt;/strong&gt; 类）”也都继承 &lt;strong&gt;&lt;em&gt;TestCommandBase &lt;/em&gt;&lt;/strong&gt;基类。当然是在继承它们应该继承的 &lt;strong&gt;&lt;em&gt;IFilter&lt;/em&gt;&lt;/strong&gt; 接口和 &lt;strong&gt;&lt;em&gt;TestFilterBase&lt;/em&gt;&lt;/strong&gt; 基类的基础上。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/liuning8023/201205/201205272303596937.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="图 3 后续处理类的类图 " border="0" alt="图 3 后续处理类的类图 " src="http://images.cnblogs.com/cnblogs_com/liuning8023/201205/201205272304006347.jpg" width="694" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;strong&gt;图 3 后续处理命令类的类图 &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://images.cnblogs.com/cnblogs_com/liuning8023/348583/o_r_翻译.jpg" width="300" height="135" /&gt; &lt;/p&gt;&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://images.cnblogs.com/cnblogs_com/liuning8023/348583/o_原创.jpg" width="300" height="135" /&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/liuning8023/nchain-0.1-src.rar" target="_blank"&gt;下载 Demo&lt;/a&gt; 运行 nchain 里的 RuntimeInstantiation 例子需要 Spring.Net&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/liuning8023/Spring.Rest-1.1.0.zip" target="_blank"&gt;下载 Spring.Rest-1.1.0.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;下载 &lt;a href="http://www.springsource.org/springsource-tool-suite-download"&gt;springsource-tool-suite&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/liuning8023/aggbug/2520374.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liuning8023/archive/2012/05/27/2520374.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520266.html</id><title type="text">.net中调用windows performance记录性能信息</title><summary type="text"/><published>2012-05-27T07:26:00Z</published><updated>2012-05-27T07:26:00Z</updated><author><name>JustRun</name><uri>http://www.cnblogs.com/JustRun1983/</uri></author><link rel="alternate" href="http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520266.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520266.html"/><content type="html">&lt;p&gt;&lt;strong&gt;记录skype的CPU 占用率&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; processorCounter = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; PerformanceCounter&lt;br/&gt;{&lt;br/&gt;       CategoryName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Process&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;       CounterName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;% Processor Time&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;       InstanceName &lt;/span&gt;=&lt;span style="color: #000000;"&gt; &amp;ldquo;skype&amp;rdquo;,&lt;br/&gt;       MachineName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;processorCounter.NextValue()&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;记录skype的内存占用&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; memoryCounter = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; PerformanceCounter&lt;br/&gt;{&lt;br/&gt;    CategoryName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Process&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    CounterName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Working Set - Private&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    InstanceName &lt;/span&gt;=&lt;span style="color: #000000;"&gt; &amp;ldquo;skype&amp;rdquo;,&lt;br/&gt;    MachineName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;memoryCounter.RawValue  返回的是字节为计量单位&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;获取当前计算计算机的cpu和内存占用情况&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;counter = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; PerformanceCounter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Processor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;% Processor Time&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &amp;ldquo;_total&amp;rdquo;);&lt;br/&gt;&lt;br/&gt;counter.NextValue() cpu占用&lt;br/&gt;&lt;br/&gt;ComputerInfo ComputerInfo &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ComputerInfo();&lt;br/&gt;&lt;br/&gt;ComputerInfo.TotalPhysicalMemory &lt;/span&gt;- ComputerInfo.AvailablePhysicalMemory 内存占用&lt;/div&gt;&lt;p&gt;注意， 使用Counter的时候，如果instanceName 不存在， 会出现异常。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/JustRun1983/aggbug/2520266.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520266.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520242.html</id><title type="text">C#只允许运行应用程序的一个实例的正确写法</title><summary type="text"/><published>2012-05-27T06:59:00Z</published><updated>2012-05-27T06:59:00Z</updated><author><name>JustRun</name><uri>http://www.cnblogs.com/JustRun1983/</uri></author><link rel="alternate" href="http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520242.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520242.html"/><content type="html">&lt;p&gt;转自 &lt;a href="http://www.cnblogs.com/hjblog/archive/2011/04/27/2030191.html"&gt;http://www.cnblogs.com/hjblog/archive/2011/04/27/2030191.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有时我们需要只允许运行应用程序的一个实例，当进程启动时，如果发现应用程序的一个实例在运行，就自动停止运行。我们通常通过Mutex互斥体在Main函数中实现，通常的写法是：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;[STAThread]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Main()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; createNew;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (System.Threading.Mutex m = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Threading.Mutex(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, Application.ProductName, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; createNew))&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (createNew)&lt;br/&gt;        {&lt;br/&gt;            Application.EnableVisualStyles();&lt;br/&gt;            Application.SetCompatibleTextRenderingDefault(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            Application.Run(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1());&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        {&lt;br/&gt;            MessageBox.Show(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Only one instance of this application is allowed!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们在寻找答案时，往往来去匆匆，根本不去理会Mutex的特性和注意事项。经过简单的测试，OK，拿来就用。此时我们忽略了一个重要的前提条件：&lt;strong&gt;Mutex的命名规则&lt;/strong&gt;。以上的写法在单用户下运行没有问题；在多用户下，每个用户都能启动一个实例，也就不能保证单实例运行了。&lt;/p&gt;&lt;p&gt;如果需要在终端机服务器上使用，并且只允许一个实例的话，请使用下面的写法： &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;[STAThread]&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Main()&lt;br/&gt;{&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; createNew;&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;     {&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (System.Threading.Mutex m = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; System.Threading.Mutex(&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Global\\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Application.ProductName, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; createNew))&lt;br/&gt;         {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (createNew)&lt;br/&gt;            {&lt;br/&gt;                Application.EnableVisualStyles();&lt;br/&gt;                Application.SetCompatibleTextRenderingDefault(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                Application.Run(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1());&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                MessageBox.Show(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Only one instance of this application is allowed!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;     }&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;     {&lt;br/&gt;           MessageBox.Show(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Only one instance of this application is allowed!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;     }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以下是MSDN的说明：&lt;/p&gt;&lt;p&gt;在运行终端服务的服务器上，已命名的系统 mutex 可以具有两级可见性。如果名称以前缀&amp;ldquo;Global\&amp;rdquo;开头，则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀&amp;ldquo;Local\&amp;rdquo;开头，则 mutex 仅在创建它的终端服务器会话中可见。在这种情况下，服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex。如果创建已命名 mutex 时不指定前缀，则它将采用前缀&amp;ldquo;Local\&amp;rdquo;。在终端服务器会话中，只是名称前缀不同的两个 mutex 是独立的 mutex，这两个 mutex 对于终端服务器会话中的所有进程均为可见。即：前缀名称&amp;ldquo;Global\&amp;rdquo;和&amp;ldquo;Local\&amp;rdquo;说明 mutex 名称相对于终端服务器会话（而并非相对于进程）的范围。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/JustRun1983/aggbug/2520242.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/JustRun1983/archive/2012/05/27/2520242.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/XmNotes/archive/2012/05/26/2519275.html</id><title type="text">除了Web，神马都是浮云</title><summary type="text"/><published>2012-05-26T07:14:00Z</published><updated>2012-05-26T07:14:00Z</updated><author><name>小城故事</name><uri>http://www.cnblogs.com/XmNotes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/XmNotes/archive/2012/05/26/2519275.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/XmNotes/archive/2012/05/26/2519275.html"/><content type="html">&lt;p&gt;Win8一天天临近，几天前消费者预览版发布，发现自己提不起什么关注的热情。我曾一度想去参加Metro应用线下讲座，报名后又注销。WPF还没推广，又推出了WinRT。Metro,WinRT，还有mac和android的，学这些都是浪费青春，web开发才是人间正道。不是这些技术不好，就像买衣服，商店里琳琅满目，或者更恰当的比喻是买房子，对多数人来说，就算买得起，这是要用几十年的东西，我们不能朝三暮四，要追求投资效益最大化，成功概念最大化。&lt;/p&gt;&lt;p&gt;当今世界日新月异，技术革命一波接着一波，一浪高过一浪， 这场技术大潮永不退潮，身处其中，我们要明白这样的道理：&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;1. 如果你有能力，可能在某一阶段站在风口浪尖，引领时代。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;90年代的微软，00年代的谷歌，是其中的代表。下一个可能是fackbook。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;2. 没有谁能永远站在风口浪尖之上。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;虽然这很酷，所以这么做凶险莫测，天气预报永远不可能100%精确，。微软谷歌的成功，踩着无数的尸体。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;3. 我们不能追上所有的浪头。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;除非你有流星赶月的能力，虽然乘风逐浪也很酷。趁年轻可以尝试一些新奇，但每一次都要有付出和成本的，未来，迟早你会期望投入的回报。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;4. 每波来潮中，一定有一支主流。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;潮流的方向，是由主流决定。虽然其他支流，不断涌现，有些支流看上去气势澎湃，比主流还壮观，但几乎都将逐渐消逝，或汇入主流。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;5. 一定会一支支流，以雷霆之势发展壮大，成为主流，引起新一波革命浪潮。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;VC，又称风投，没有风险不投，就是靠猜这个吃饭。&lt;/p&gt;&lt;p&gt;世界在改变，没有永远不变的方向，不要想着一劳永逸。虽然我们绝大多数人，都只能跟随潮流，只要看准主流，我们就会应付自如，才不至疲于奔命。&lt;/p&gt;&lt;p&gt;回到与我们息息相关的软件产业中，过去数十年间，虽然新技术风起云涌，好戏不断，但是总有一个主线。80和90年代是PC时代，那时计算机早已经出现许多年，编程语言也早已发展到第三代。其中有许多还耳熟的名字Cobol, Fortran, Pascal等等，先后淡出了人们的视线。C语言原来是Unix系统的脚本语言，随着Unix推广而流行，后来成为跨平台的标准。简洁高效，移植性好，又具有所有其他结构化语言的特点，所以在众多竞争者中脱颖而出。不但至今占据编程排行榜第一宝座，而且排行榜前六，也都由一堆源于C语言&amp;ldquo;C系&amp;rdquo;语言占据。&lt;/p&gt;&lt;p&gt;回顾这段历史，我们可以看到主流技术的发展规律：本来是某个特定平台的解决方案，由于其先进特性而被人们注意，开放的特性使其可能被移植到其他平台，从而被更多人使用，又被移植到更多平台，最后形成标准，直至没有人抗拒。&lt;/p&gt;&lt;p&gt;当初如果两个大学生，都看到软件行业的前景，一个考Basic，一个考C语言，虽然后者难一些，却是有眼光的选择。&lt;/p&gt;&lt;p&gt;PC时代，软件开发领域，主流是C以及之后发展起来C++，应用于不同领域，各有所长。Visual Basic和Delphi都很酷， 但是，五年后、十年后，你的代码在哪里，你的程序谁在用？&lt;/p&gt;&lt;p&gt;90年代互联网开始萌芽，Java应运而生，2000年时，.NET作为Java的竞争者诞生。新一代，基于互联网的语言，也包括Python, Ruby, node.js将是主流，C/C++仍然不可或缺，领域或日益缩小。&lt;/p&gt;&lt;p&gt;当局者迷，旁观者清，虽然现在信息途径畅通，仍然很难预测技术的走向。但我们至少可以大致描述技术的趋势，什么技术顺应了这种趋势，什么技术是倒退（即使看上去酷）。互联网时代，要求彻底的开放性和一致性，空前地扩展性和兼容性。&lt;/p&gt;&lt;p&gt;苹果就是这方面极端的反例，Mac和IPhone系列上的技术，封闭又霸道。这种模式，再成功也只是苹果一家公司的成功，而不能惠及业界，带动整个互联网发展。这种成功，是难以持续的。&lt;/p&gt;&lt;p&gt;微软是矛盾结合体，我们看到，.NET是朝这个方向走的，尽管.NET是微软的产品，但遵循的标准是跨平台的。.NET Framework的初衷也是统一开发体验，比如ADO.NET提出的数据访问模式，这种体验会不断完善，比如在ADO.NET基础上的Entity Framework。但是在UI方面，统一得不好，先是Winform，再WPF，到现在的Metro/WinRT，而MFC依然发挥作用，变化太快，选择虽然多，但都没有形成跨平台标准(Winform 有Mono实现，WPF就没有）。&lt;/p&gt;&lt;p&gt;谷歌是主流方向的坚定执行者，Web开发才是主流，Html5才是主流。桌面上的应用迟早有一天会网络化，桌面开发和Web开发将融为一体。虽然前面路还很长，未来会遇到许多障碍和阻力，但历史潮流是阻挡不了的。&lt;/p&gt;&lt;p&gt;我们应该坚定地支持Google，选择地跟随微软，坚决地远离苹果。不是说苹果的产品不要买，是对苹果的技术敬而远之，不要做水果忍者里的一只苹果。像WinRT和Metro这些东东，周末无压力时可以玩一下，对于.NET程序员，特别是新人来说，Asp.NET，WCF，多线程，应该全力深入这些核心，有闲功夫就到多在社区活动下 ，贡献源码，发文回贴都很好，让有限的精力得到最大化的利用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/XmNotes/aggbug/2519275.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/XmNotes/archive/2012/05/26/2519275.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ForEvErNoME/archive/2012/05/26/2518779.html</id><title type="text">一步步写自己SqlHelper类库（七）：DataSet对象</title><summary type="text"/><published>2012-05-26T06:03:00Z</published><updated>2012-05-26T06:03:00Z</updated><author><name>ForEvErNoMe</name><uri>http://www.cnblogs.com/ForEvErNoME/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ForEvErNoME/archive/2012/05/26/2518779.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ForEvErNoME/archive/2012/05/26/2518779.html"/><content type="html">&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;1.DataSet基础&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;DataSet&amp;nbsp;是ADO.NET 结构非连接结构的主要组件，它是从数据源中检索到的数据在内存中的缓存。&amp;nbsp;&lt;span id="mt12" class="sentence" data-guid="3b1c5f0793631dccf7e2185b44cd0273" data-source="As a result, it can be used with multiple and differing data sources, used with XML data, or used to manage data local to the application."&gt;因此，它可以用于多种不同的数据源，用于 XML 数据，或用于管理应用程序本地的数据。&lt;/span&gt;&amp;nbsp;&lt;span id="mt13" class="sentence" data-guid="f7e2857a12250567dd86574518aea465" data-source="The &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;input&amp;quot;&amp;gt;DataSet&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; contains a collection of one or more &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;mtpsTagOuterHtml&amp;quot; outerHtml=&amp;quot;PG10cHM6SW5zdHJ1bWVudGVkTGluayBOYXZpZ2F0ZVVybD0iQXNzZXRJZDpUJTNhU3lzdGVtLkRhdGEuRGF0YVRhYmxlIiBydW5hdD0ic2VydmVyIiB4bWxuczptdHBzPSJodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9tdHBzIj5EYXRhVGFibGU8L210cHM6SW5zdHJ1bWVudGVkTGluaz4=&amp;quot;&amp;gt;&amp;lt;span&amp;gt;DataTable&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; objects consisting of rows and columns of data, and also primary key, foreign key, constraint, and relation information about the data in the &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;input&amp;quot;&amp;gt;DataTable&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; objects."&gt;&lt;span&gt;&lt;span class="input"&gt;DataSet&lt;/span&gt;&lt;/span&gt;&amp;nbsp;包含一个或多个&amp;nbsp;&lt;span&gt;DataTable&lt;/span&gt;&amp;nbsp;对象的集合，这些对象由数据行和数据列以及有关&amp;nbsp;&lt;span&gt;&lt;span class="input"&gt;DataTable&lt;/span&gt;&lt;/span&gt;&amp;nbsp;对象中数据的主键、外键、约束和关系信息组成&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="sentence" data-guid="f7e2857a12250567dd86574518aea465" data-source="The &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;input&amp;quot;&amp;gt;DataSet&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; contains a collection of one or more &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;mtpsTagOuterHtml&amp;quot; outerHtml=&amp;quot;PG10cHM6SW5zdHJ1bWVudGVkTGluayBOYXZpZ2F0ZVVybD0iQXNzZXRJZDpUJTNhU3lzdGVtLkRhdGEuRGF0YVRhYmxlIiBydW5hdD0ic2VydmVyIiB4bWxuczptdHBzPSJodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9tdHBzIj5EYXRhVGFibGU8L210cHM6SW5zdHJ1bWVudGVkTGluaz4=&amp;quot;&amp;gt;&amp;lt;span&amp;gt;DataTable&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; objects consisting of rows and columns of data, and also primary key, foreign key, constraint, and relation information about the data in the &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;input&amp;quot;&amp;gt;DataTable&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; objects."&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #993300;"&gt;&lt;span class="sentence" data-guid="f7e2857a12250567dd86574518aea465" data-source="The &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;input&amp;quot;&amp;gt;DataSet&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; contains a collection of one or more &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;mtpsTagOuterHtml&amp;quot; outerHtml=&amp;quot;PG10cHM6SW5zdHJ1bWVudGVkTGluayBOYXZpZ2F0ZVVybD0iQXNzZXRJZDpUJTNhU3lzdGVtLkRhdGEuRGF0YVRhYmxlIiBydW5hdD0ic2VydmVyIiB4bWxuczptdHBzPSJodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9tdHBzIj5EYXRhVGFibGU8L210cHM6SW5zdHJ1bWVudGVkTGluaz4=&amp;quot;&amp;gt;&amp;lt;span&amp;gt;DataTable&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; objects consisting of rows and columns of data, and also primary key, foreign key, constraint, and relation information about the data in the &amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;input&amp;quot;&amp;gt;DataTable&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; objects."&gt;2&lt;/span&gt;.DataSet几个重要对象&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;TablesCollection对象：&lt;/span&gt;&lt;span&gt;DataSet里的表用DataTable来表示，一个DataSet里面可以包含多个DataTable，这些DataTable就构成了TablesCollection对象。每个DataTable中都包含一个ColumnsColleciton和一个RowsCollection对象。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;RelationsCollection对象：&lt;/span&gt;&lt;span&gt;各个DataTable之间的关系通过DataRelation来表达，这些DataRelation构成的集合就是RelationsCollection对象。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #993300;"&gt;3.基础实例&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.1 DataTable对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;创建DataTable&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;DataTable dt = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DataTable(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Test&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;dt.CaseSensitive &lt;/span&gt;=&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否区分大小写&lt;/span&gt;&lt;br/&gt;dt.MinimumCapacity = &lt;span style="color: #800080;"&gt;100&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;数据库的最小记录空间&lt;/span&gt;&lt;/div&gt;&lt;p&gt;创建表列&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;DataTable MyTable;&lt;br/&gt;DataColumn MyColumn;&lt;br/&gt;MyTable &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DataTable (&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;表名&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;MyColumn &lt;/span&gt;= MyTable.Columns.Add(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;列名&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;，&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br/&gt;MyColumn &lt;/span&gt;= MyTable.Columns.Add(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;列名&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;，&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;));&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.2&amp;nbsp;DataView对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;DataView就是数据视图，为数据库结构提供了外模式的实现。同时DataView也可以为窗体控件和Web控件提供数据绑定功能，在每一个DataTable中内建了一个DataView为：DataTable.DefaultView()。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;DataView dv = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DataView(ds.Tables[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;news&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br/&gt;dv.RowFilter &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;state ＝ 'CA'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;dv.Sort &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.3&amp;nbsp;DataColumn对象&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;DataColumn colCustomerID = dtCustomers.Columns.Add(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CustomerId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(Int32));&lt;br/&gt;&lt;br/&gt;colCustomerID.AllowDBNull &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;colCustomerID.Unique &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.4 DataRow对象&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;创建DataRow对象&lt;/span&gt;&lt;br/&gt;DataRow drNewEmployee =&lt;span style="color: #000000;"&gt; dtEmployees.NewRow();&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用索引或列名操作新行&lt;/span&gt;&lt;br/&gt;drNewEmployee(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;) = &lt;span style="color: #800080;"&gt;11&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;drNewEmployee(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;) = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Smith&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调用Add方法将行添加到DataRowCollection中&lt;/span&gt;&lt;br/&gt;dtEmployees.Rows.Add(drNewEmployee);&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div id="MySignature" style="width: 90%; margin: 0 auto;"&gt;&lt;div id="PSignature" style="height: 120px; line-height: 20px; padding-top: 20px; padding-right: 10px; padding-bottom: 10px; padding-left: 150px; background: url('http://images.cnblogs.com/cnblogs_com/ForEvErNoME/345750/t_me.jpg') #FFF7DC no-repeat 2% 50%; font-size: 12px; border: 1px solid #FFBFBF;"&gt;作者： &lt;a style="text-decoration: none; color: #075db3;" href="http://www.cnblogs.com/ForEvErNoME/" target="_blank"&gt;ForEvErNoME&lt;/a&gt; &lt;br /&gt; 出处： &lt;a style="text-decoration: none; color: #075db3;" href="http://www.cnblogs.com/ForEvErNoME/" target="_blank"&gt;http://www.cnblogs.com/ForEvErNoME/&lt;/a&gt; &lt;br /&gt; 欢迎转载或分享，但请务必声明文章出处。如果文章对您有帮助，希望你能 &lt;span style="color: #ab0eab; font-weight: bold;"&gt;推荐&lt;/span&gt; 或 &lt;span style="color: #ab0eab; font-weight: bold;"&gt;关注&lt;/span&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/ForEvErNoME/aggbug/2518779.html?type=0" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ForEvErNoME/archive/2012/05/26/2518779.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
