<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feeds.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feeds.feedsky.com/csdn.net/web718" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feeds.feedsky.com/csdn.net/web718" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 01 Feb 2012 08:47:15 GMT</lastBuildDate><title>Asp.net2.0开发专栏</title><description>推荐大家使用在线.net代码生成器 www.maiton.cn</description><link>http://blog.csdn.net/web718</link><language>zh-cn</language><copyright>Copyright &amp;copy; web718</copyright><pubDate>Thu, 24 May 2012 16:45:38 GMT</pubDate><image><url>http://static.blog.csdn.net/images/logo.gif</url><link>http://blog.csdn.net</link></image><item><title>[原]使用 JSONP 实现跨域通信，第 1 部分: 结合 JSONP 和 jQuery 快速构建强大的 mashup</title><link>http://blog.csdn.net/web718/article/details/7226102</link><description>&lt;p&gt;&lt;a name=&quot;intro&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;简介&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点（流行术语为 Web 2.0 站点）的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用
&lt;code&gt;XMLHttpRequest&lt;/code&gt; 函数获取数据，它是一种 API，允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力，它可将来自多个地方的内容集成为单一 Web 应用程序。&lt;/p&gt;
&lt;p&gt;不过，由于受到浏览器的限制，该方法不允许跨域通信。如果尝试从不同的域请求数据，会出现安全错误。如果能控制数据驻留的远程服务器并且每个请求都前往同一域，就可以避免这些安全错误。但是，如果仅停留在自己的服务器上，Web 应用程序还有什么用处呢？如果需要从多个第三方服务器收集数据时，又该怎么办？&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;same_origin_policy&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;理解同源策略限制&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说，受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容，以防止它们之间的操作。这个浏览器策略很旧，从 Netscape Navigator 2.0 版本开始就存在。
&lt;/p&gt;
&lt;p&gt;克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据，并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用，但它是不可伸缩的。另一种方式是使用框架要素在当前 Web 页面中创建新区域，并且使用
&lt;code&gt;GET&lt;/code&gt; 请求获取任何第三方资源。不过，获取资源后，框架中的内容会受到同源策略的限制。&lt;/p&gt;
&lt;p&gt;克服该限制更理想方法是在 Web 页面中插入动态脚本元素，该页面源指向其他域中的服务 URL 并且在自身脚本中获取数据。脚本加载时它开始执行。该方法是可行的，因为同源策略不阻止动态脚本插入，并且将脚本看作是从提供 Web 页面的域上加载的。但如果该脚本尝试从另一个域上加载文档，就不会成功。幸运的是，通过添加 JavaScript Object Notation (JSON) 可以改进该技术。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;json_jsonp&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;JSON 和 JSONP&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JSON 是用于在浏览器和服务器之间交换信息的轻量级数据&amp;#26684;式（与 XML 相比）。JOSON 依赖于 JavaScript 开发人员，因为它是 JavaScript 对象的字符串表示。例如，假设有一个含两个属性的 ticker 对象：symbol 和 price。这是在 JavaScript 中定义 ticker 对象的方式：
&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;var ticker = {symbol: 'IBM', price: 91.42};&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;并且这是它的 JSON 表示方式： &lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;{symbol: 'IBM', price: 91.42}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;从 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/#resources&quot;&gt;参考资料&lt;/a&gt; 查找更多有关 JSON 和将其作为数据内部交换&amp;#26684;式的信息。清单 1 定义了一个 JavaScript 函数，调用该函数时会显示 IBM 的股价。（我们没有详细介绍如何将该函数添加到 Web 页面）。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N100B9&quot;&gt;&lt;strong&gt;清单 1. 定义 showPrice 函数&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;function showPrice(data) {
    alert(&amp;quot;Symbol: &amp;quot; &amp;#43; data.symbol &amp;#43; &amp;quot;, Price: &amp;quot; &amp;#43; data.price);
}
                &lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;可以将 JSON 数据作为参数传递，以调用该函数：&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;showPrice({symbol: 'IBM', price: 91.42}); // alerts: Symbol: IBM, Price: 91.42
                &lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;现在准备将这两个步骤包含到 Web 页面，如清单 2 所示。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N100CB&quot;&gt;&lt;strong&gt;清单 2. 在 Web 页面中包含 showPrice 函数和参数&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function showPrice(data) {
    alert(&amp;quot;Symbol: &amp;quot; &amp;#43; data.symbol &amp;#43; &amp;quot;, Price: &amp;quot; &amp;#43; data.price);
}
&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;showPrice({symbol: 'IBM', price: 91.42});&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;加载页面后，应该看如图 1 所示的警告。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;ticker&quot;&gt;&lt;strong&gt;图 1. IBM ticker&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;img alt=&quot;IBM ticker&quot; src=&quot;http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/ticker.jpg&quot; width=&quot;326&quot; height=&quot;126&quot;&gt;
&lt;br&gt;
&lt;p&gt;至此，本文已展示了如何将静态 JSON 数据作为参数调用 JavaScript 函数。不过，通过在函数调用中动态包装 JSON 数据可以用动态数据调用函数，这是一种动态 JavaScript 插入的技术。要查看其效果，将下面一行放入名为 ticker.js 的独立 JavaScript 文件中。&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;showPrice({symbol: 'IBM', price: 91.42});&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;现在改变 Web 页面中的脚本，使其和清单 3 一样。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N100EF&quot;&gt;&lt;strong&gt;清单 3. 动态 JavaScript 插入代码&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
// This is our function to be called with JSON data
function showPrice(data) {
    alert(&amp;quot;Symbol: &amp;quot; &amp;#43; data.symbol &amp;#43; &amp;quot;, Price: &amp;quot; &amp;#43; data.price);
}
var url = “ticker.js”; // URL of the external script
// this shows dynamic script insertion
var script = document.createElement('script');
script.setAttribute('src', url);

// load the script
document.getElementsByTagName('head')[0].appendChild(script); 
&amp;lt;/script&amp;gt;
				&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;在清单 3 所示的例子中，动态插入的 JavaScript 代码位于 ticker.js 文件中，它将真正的 JSON 数据作为参数调用 &lt;code&gt;showPrice()&lt;/code&gt;函数。&lt;/p&gt;
&lt;p&gt;前面已经提到，同源策略不阻止将动态脚本元素插入文档中。也就是说，可以动态插入来自不同域的 JavaScript，并且这些域都携带 JSON 数据。这其实是真正的 JSONP（JSON with Padding）：打包在函数调用中的 JSON 数据。注意，为了完成该操作，Web 页面必须在插入时具有已经定义好的回调函数，也就是我们例子中的
&lt;code&gt;showPrice()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;不过，所谓的 JSONP 服务（或 Remote JSON Service）是一种带有附加功能的 Web 服务，该功能支持在特定于用户的函数调用中打包返回的 JSON 数据。这种方法依赖于接受回调函数名作为请求参数的远程服务。然后该服务生成对该函数的调用，将 JSON 数据作为参数传递，在到达客户端时将其插入 Web 页面并开始执行。&lt;/p&gt;
&lt;p class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/#ibm-pcon&quot; class=&quot;ibm-anchor-up-link&quot;&gt;回页首&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;jquery_support&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;jQuery 的 JSONP 支持&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从 1.2 版本开始，jQuery 拥有对 JSONP 回调的本地支持。如果指定了 JSONP 回调，就可以加载位于另一个域的 JSON 数据，回调的语法为：&lt;code&gt;url?callback=&lt;strong&gt;?&lt;/strong&gt;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;jQuery 自动将 &lt;strong&gt;?&lt;/strong&gt; 替换为要调用的生成函数名。清单 4 显示了该代码。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N1011E&quot;&gt;&lt;strong&gt;清单 4. 使用 JSONP 回调&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;jQuery.getJSON(url&amp;#43;&amp;quot;&amp;amp;callback=?&amp;quot;, function(data) {
    alert(&amp;quot;Symbol: &amp;quot; &amp;#43; data.symbol &amp;#43; &amp;quot;, Price: &amp;quot; &amp;#43; data.price);
});
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;为此，jQuery 将一个全局函数附加到插入脚本时需要调用的窗口对象。另外，jQuery 也能优化非跨域调用。如果向同一个域发出请求，jQuery 就将其转化为普通 Ajax 请求。
&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;sample_jsonp&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;使用 JSONP 支持的示例服务&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在上一个例子中，使用了静态文件（ticker.js）将 JavaScript 动态插入到 Web 页面中。尽管返回了 JSONP 回复，但它不允许您在 URL 中定义回调函数名。这不是 JSONP 服务。因此，如何才能将其转换为真正的 JSONP 服务呢？可使用的方法很多。这里我们将分别使用 PHP 和 Java 展示两个示例。&lt;/p&gt;
&lt;p&gt;首先，假设您的服务在所请求的 URL 中接受了一个名为 &lt;code&gt;callback&lt;/code&gt; 的参数。（参数名不重要，但是客户和服务器必须都同意该名称）。另外假设向服务发送的请求是这样的：&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;http://www.yourdomain.com/jsonp/ticker?symbol=IBM&amp;amp;callback=showPrice&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;在这种情况下，&lt;code&gt;symbol&lt;/code&gt; 是表示请求 ticker symbol 的请求参数，而 &lt;code&gt;callback&lt;/code&gt; 是 Web 应用程序的回调函数的名称。使用清单 5 所示的代码可以通过 jQuery 的 JSONP 支持调用该服务。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N10149&quot;&gt;&lt;strong&gt;清单 5. 调用回调服务&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;jQuery.getJSON(&amp;quot;http://www.yourdomain.com/jsonp/ticker?symbol=IBM&amp;amp;callback=?&amp;quot;, 
function(data) {
    alert(&amp;quot;Symbol: &amp;quot; &amp;#43; data.symbol &amp;#43; &amp;quot;, Price: &amp;quot; &amp;#43; data.price);
});
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;注意，我们使用 &lt;code&gt;?&lt;/code&gt; 作为回调函数名，而非真实的函数名。因为 jQuery 会用生成的函数名替换 &lt;code&gt;?&lt;/code&gt;。所以您不用定义类&amp;#20284;于
&lt;code&gt;showPrice()&lt;/code&gt; 的函数。&lt;/p&gt;
&lt;p&gt;清单 6 显示了用 PHP 实现的 JSONP 服务的一段代码。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N10163&quot;&gt;&lt;strong&gt;清单 6. 用 PHP 实现的 JSONP 服务的代码片段&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;$jsonData = getDataAsJson($_GET['symbol']);
echo $_GET['callback'] . '(' . $jsonData . ');';
// prints: jsonp1232617941775({&amp;quot;symbol&amp;quot; : &amp;quot;IBM&amp;quot;, &amp;quot;price&amp;quot; : &amp;quot;91.42&amp;quot;});
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;清单 7 显示了具有同样功能的 Java™ Servlet 方法。&lt;/p&gt;
&lt;br&gt;
&lt;a name=&quot;N10170&quot;&gt;&lt;strong&gt;清单 7. 用 Java servlet 实现的 JSONP 服务&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
  throws ServletException, IOException {
	String jsonData = getDataAsJson(req.getParameter(&amp;quot;symbol&amp;quot;));
	String output = req.getParameter(&amp;quot;callback&amp;quot;) &amp;#43; &amp;quot;(&amp;quot; &amp;#43; jsonData &amp;#43; &amp;quot;);&amp;quot;;

	resp.setContentType(&amp;quot;text/javascript&amp;quot;);
          
	PrintWriter out = resp.getWriter();
	out.println(output);
	// prints: jsonp1232617941775({&amp;quot;symbol&amp;quot; : &amp;quot;IBM&amp;quot;, &amp;quot;price&amp;quot; : &amp;quot;91.42&amp;quot;});
}
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;那么，如果要构建 mashup 应该怎么办，是从第三方服务器收集内容，并在单一的 Web 页面中显示它们吗？答案很简单：您必须使用第三方 JSONP 服务。这种服务并不少。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;sample_jsonp_services&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;现成的 JSONP 服务&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;知道如何使用 JSONP 之后，可以开始使用一些现成的 JSONP Web 服务来构建应用程序和 mashup。下面为接下来的开发项目做准备。（提示：您可以复制特定的 URL 并将其粘贴到浏览器的地址栏，以检查生成的 JSONP 响应）。&lt;/p&gt;
&lt;p&gt;Digg API：来自 Digg 的头条新闻：&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&amp;amp;type=javascript
&amp;amp;callback=?
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;Geonames API：邮编的位置信息：&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&amp;amp;country=US&amp;amp;callback=?&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;Flickr API：来自 Flickr 的最新猫图片：&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;amp;tagmode=any
&amp;amp;format=json&amp;amp;jsoncallback=?
                &lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p&gt;Yahoo Local Search API：在邮编为 10504 的地区搜索比萨：&lt;/p&gt;
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;http://local.yahooapis.com/LocalSearchService/V3/localSearch?appid=YahooDemo&amp;amp;query=pizza
&amp;amp;zip=10504&amp;amp;results=2&amp;amp;output=json&amp;amp;callback=?
&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;p class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/#ibm-pcon&quot; class=&quot;ibm-anchor-up-link&quot;&gt;回页首&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;cautionary_note&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;重要提示&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JSONP 是构建 mashup 的强大技术，但不幸的是，它并不是所有跨域通信需求的万灵药。它有一些缺陷，在提交开发资源之前必须认真考虑它们。第一，也是最重要的一点，没有关于 JSONP 调用的错误处理。如果动态脚本插入有效，就执行调用；如果无效，就静默失败。失败是没有任何提示的。例如，不能从服务器捕捉到 404 错误，也不能取消或重新开始请求。不过，等待一段时间还没有响应的话，就不用理它了。（未来的 jQuery 版本可能有终止 JSONP 请求的特性）。&lt;/p&gt;
&lt;p&gt;JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应，而函数调用是由浏览器执行的，这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务，了解它能造成的威胁非常重要。（参见
&lt;a href=&quot;http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/#resources&quot;&gt;参考资料&lt;/a&gt; 了解更多信息）。&lt;/p&gt;
&lt;p class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/#ibm-pcon&quot; class=&quot;ibm-anchor-up-link&quot;&gt;回页首&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;conclusion&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;结束语&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在该系列的第一篇文章中，我们讲解了如何结合使用 JSONP 和 jQuery 快速构建强大的 mashup。主要主题包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器同源策略的限制以及解决办法&lt;/li&gt;&lt;li&gt;作为一种有效的跨域通信技术，JSONP 能够绕过当前浏览器的同源策略限制&lt;/li&gt;&lt;li&gt;JSONP 使 Web 应用程序开发人员能够快速构建 mashup&lt;/li&gt;&lt;li&gt;示例 JSONP 服务及其使用：Ticker 服务&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;本系列的下一篇文章将介绍 Yahoo! 查询语言（YQL），这种单端点 JSONP 服务允许您跨 Web 查询、过滤和合并数据。最后还使用 YQL 和 jQuery 构建 mashup 应用程序。&lt;/p&gt;
&lt;br&gt;

            &lt;div&gt;
                作者：web718 发表于2012-2-1 16:47:15 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/7226102&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：17 评论：0 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/7226102#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944648/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/7226102&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Wed, 01 Feb 2012 16:47:15 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/7226102</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/7226102</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944648/1059433</fs:itemid></item><item><title>[原]Facebook网站所使用的开源软件一览表</title><link>http://blog.csdn.net/web718/article/details/6535812</link><description>&lt;p&gt;Facebook是全球首屈一指的社交网络平台，该网站采用了很多开源软件，Facebook采用的编程语言包括：Java,Ruby,PHP,Python,Objective-C.&lt;/p&gt;
&lt;p&gt;下面是Facebook正在使用或者贡献的开源软件详细列表和介绍：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/cassandra&quot;&gt;&lt;strong&gt;Apache Cassandra&lt;/strong&gt;
&lt;/a&gt;
是一套开源分布式Key-Value存储系统。它最初由Facebook开发，用于储存特别大的数据。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/mysql&quot;&gt;&lt;strong&gt;MySQL&lt;/strong&gt;
&lt;/a&gt;
这个不需要在介绍什么了吧，使用最为广泛的开源数据库。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/memcached&quot;&gt;&lt;strong&gt;Memcached&lt;/strong&gt;
&lt;/a&gt;
是一个高性能的、分布式的内存对象缓存系统。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/scribe&quot;&gt;&lt;strong&gt;Scribe&lt;/strong&gt;
&lt;/a&gt;
旨在帮助Facebook处理服务器上的大量数据，正像Scribe网页所述&amp;ldquo;如经常访问Facebook，请使用Scribe。&amp;rdquo;具体而言，Scribe就是一台服务器，实时收集用网站日志信息。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/thrift&quot;&gt;&lt;strong&gt;Thrift&lt;/strong&gt;
&lt;/a&gt;
是一个可伸缩的跨语言的服务开发框架。Key-Value存储服务器&lt;a href=&quot;http://www.oschina.net/p/cassandra&quot;&gt;Cassandra&lt;/a&gt;
就是使用Thrift作为其客户端API的。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/flashcache&quot;&gt;&lt;strong&gt;FlashCache&lt;/strong&gt;
&lt;/a&gt;
是一个适合一般应用场景的MySQL缓存优化模块。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.oschina.net/p/hadoop&quot;&gt;&lt;strong&gt;Hadoop&lt;/strong&gt;
&lt;/a&gt;
并不仅仅是一个用于存储的分布式文件系统，而是设计用来在由通用计算设备组成的大型集群上执行分布式应用的框架。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/hive&quot;&gt;&lt;strong&gt;Hive&lt;/strong&gt;
&lt;/a&gt;
是一个基于&lt;a href=&quot;http://www.oschina.net/p/hadoop&quot;&gt;Hadoop&lt;/a&gt;
的数据仓库平台。通过hive，我们可以方便地进行ETL的工作。hive定义了一个类似于SQL的查询语言：HQL，能 够将用户编写的QL转化为相应的Mapreduce程序基于Hadoop执行。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
Open Graph protocol可让你的任何网页变成社交图谱。&lt;a href=&quot;http://ogp.me/&quot; target=&quot;_blank&quot;&gt;http://ogp.me/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
OpenCompute - 一个开源硬件项目，提供高能效的数据中心。&lt;a href=&quot;http://opencompute.org/&quot; target=&quot;_blank&quot;&gt;http://opencompute.org/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.oschina.net/p/tornado&quot;&gt;&lt;strong&gt;Tornado&lt;/strong&gt;
&lt;/a&gt;
 web server 是使用Python编写出來的一个极轻量级、高可伸缩性和非阻塞IO的Web服务器软件，著名的Friendfeed网站就是使用它搭建的。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;http://www.oschina.net/p/varnish&quot;&gt;Varnish&lt;/a&gt;
&lt;/strong&gt;
&amp;nbsp;cache 是一款高性能的开源HTTP加速器，挪威最大的在线报纸 Verdens Gang (&lt;a title=&quot;Varnish&quot; href=&quot;http://www.vg.no/&quot; target=&quot;_blank&quot; title=&quot;Varnish&quot;&gt;http://www.vg.no&lt;/a&gt;
) 使用3台Varnish代替了原来的12台&lt;a href=&quot;http://www.oschina.net/p/squid&quot;&gt;squid&lt;/a&gt;
，性能居然比以前更好。&lt;/p&gt;
&lt;p&gt;原文出处：&lt;a href=&quot;http://www.oschina.net/news/17509/opensource-used-in-facebook&quot; target=&quot;_blank&quot;&gt;开源中国社区&lt;/a&gt;
&lt;/p&gt;
            &lt;div&gt;
                作者：web718 发表于2011-6-10 10:25:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/6535812&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：68 评论：0 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/6535812#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944647/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/6535812&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Fri, 10 Jun 2011 10:25:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/6535812</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/6535812</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944647/1059433</fs:itemid></item><item><title>[原]HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析</title><link>http://blog.csdn.net/web718/article/details/5219195</link><description>&lt;p&gt;&lt;span style=&quot;color: #0000ff; font-size: small;&quot;&gt;HTTP 错误 400 &lt;br /&gt;
400 请求出错 &lt;br /&gt;
由于语法格式有误，服务器无法理解此请求。不作修改，客户程序就无法重复此请求。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 401 &lt;br /&gt;
401.1 未授权：登录失败 &lt;br /&gt;
此错误表明传输给服务器的证书与登录服务器所需的证书不匹配。 &lt;br /&gt;
请与 Web 服务器的管理员联系，以确认您是否具有访问所请求资源的权限。 &lt;br /&gt;
401.2 未授权：服务器的配置导致登录失败 &lt;br /&gt;
此错误表明传输给服务器的证书与登录服务器所需的证书不匹配。此错误通常由未发送正确的 WWW 验证表头字段所致。 &lt;br /&gt;
请与 Web 服务器的管理员联系，以确认您是否具有访问所请求资源的权限。 &lt;br /&gt;
401.3 未授权：由于资源中的 ACL 而未授权 &lt;br /&gt;
此错误表明客户所传输的证书没有对服务器中特定资源的访问权限。此资源可能是客户机中的地址行所列出的网页或文件，也可能是处理客户机中的地址行所列出的文件所需服务器上的其他文件。 &lt;br /&gt;
请记录试图访问的完整地址，并与 Web 服务器的管理员联系以确认您是否具有访问所请求资源的权限。 &lt;br /&gt;
401.4 未授权：授权服务被筛选程序拒绝 &lt;br /&gt;
此错误表明 Web 服务器已经安装了筛选程序，用以验证连接到服务器的用户。此筛选程序拒绝连接到此服务器的真品证书的访问。 &lt;br /&gt;
请记录试图访问的完整地址，并与 Web 服务器的管理员联系以确认您是否具有访问所请求资源的权限。 &lt;br /&gt;
401.5 未授权：ISAPI/CGI 应用程序的授权失败 &lt;br /&gt;
此错误表明试图使用的 Web服务器中的地址已经安装了 ISAPI 或 CGI程序，在继续之前用以验证用户的证书。此程序拒绝用来连接到服务器的真品证书的访问。 &lt;br /&gt;
请记录试图访问的完整地址，并与 Web服务器的管理员联系以确认您是否具有访问所请求资源的权限 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 403 &lt;br /&gt;
403.1 禁止：禁止执行访问 &lt;br /&gt;
如果从并不允许执行程序的目录中执行 CGI、ISAPI或其他执行程序就可能引起此错误。 &lt;br /&gt;
如果问题依然存在，请与 Web 服务器的管理员联系。 &lt;br /&gt;
403.2 禁止：禁止读取访问 &lt;br /&gt;
如果没有可用的默认网页或未启用此目录的目录浏览，或者试图显示驻留在只标记为执行或脚本权限的目录中的HTML 页时就会导致此错误。 &lt;br /&gt;
如果问题依然存在，请与 Web 服务器的管理员联系。 &lt;br /&gt;
403.3 禁止：禁止写访问 &lt;br /&gt;
如果试图上载或修改不允许写访问的目录中的文件，就会导致此问题。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
403.4 禁止：需要 SSL &lt;br /&gt;
此错误表明试图访问的网页受安全套接字层（SSL）的保护。要查看，必须在试图访问的地址前输入https:// 以启用 SSL。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
403.5 禁止：需要 SSL 128 &lt;br /&gt;
此错误消息表明您试图访问的资源受 128位的安全套接字层（SSL）保护。要查看此资源，需要有支持此SSL 层的浏览器。 &lt;br /&gt;
请确认浏览器是否支持 128 位 SSL安全性。如果支持，就与 Web服务器的管理员联系，并报告问题。 &lt;br /&gt;
403.6 禁止：拒绝 IP 地址 &lt;br /&gt;
如果服务器含有不允许访问此站点的 IP地址列表，并且您正使用的 IP地址在此列表中，就会导致此问题。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
403.7 禁止：需要用户证书 &lt;br /&gt;
当试图访问的资源要求浏览器具有服务器可识别的用户安全套接字层（SSL）证书时就会导致此问题。可用来验证您是否为此资源的合法用户。 &lt;br /&gt;
请与 Web服务器的管理员联系以获取有效的用户证书。 &lt;br /&gt;
403.8 禁止：禁止站点访问 &lt;br /&gt;
如果 Web服务器不为请求提供服务，或您没有连接到此站点的权限时，就会导致此问题。 &lt;br /&gt;
请与 Web 服务器的管理员联系。 &lt;br /&gt;
403.9 禁止访问：所连接的用户太多 &lt;br /&gt;
如果 Web太忙并且由于流量过大而无法处理您的请求时就会导致此问题。请稍后再次连接。 &lt;br /&gt;
如果问题依然存在，请与 Web 服务器的管理员联系。 &lt;br /&gt;
403.10 禁止访问：配置无效 &lt;br /&gt;
此时 Web 服务器的配置存在问题。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
403.11 禁止访问：密码已更改 &lt;br /&gt;
在身份验证的过程中如果用户输入错误的密码，就会导致此错误。请刷新网页并重试。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
403.12 禁止访问：映射程序拒绝访问 &lt;br /&gt;
拒绝用户证书试图访问此 Web 站点。 &lt;br /&gt;
请与站点管理员联系以建立用户证书权限。如果必要，也可以更改用户证书并重试。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 404 &lt;br /&gt;
404 找不到 &lt;br /&gt;
Web 服务器找不到您所请求的文件或脚本。请检查URL 以确保路径正确。 &lt;br /&gt;
如果问题依然存在，请与服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 405 &lt;br /&gt;
405 不允许此方法 &lt;br /&gt;
对于请求所标识的资源，不允许使用请求行中所指定的方法。请确保为所请求的资源设置了正确的 MIME 类型。 &lt;br /&gt;
如果问题依然存在，请与服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 406 &lt;br /&gt;
406 不可接受 &lt;br /&gt;
根据此请求中所发送的&amp;ldquo;接受&amp;rdquo;标题，此请求所标识的资源只能生成内容特征为&amp;ldquo;不可接受&amp;rdquo;的响应实体。 &lt;br /&gt;
如果问题依然存在，请与服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 407 &lt;br /&gt;
407 需要代理身份验证 &lt;br /&gt;
在可为此请求提供服务之前，您必须验证此代理服务器。请登录到代理服务器，然后重试。 &lt;br /&gt;
如果问题依然存在，请与 Web 服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 412 &lt;br /&gt;
412 前提条件失败 &lt;br /&gt;
在服务器上测试前提条件时，部分请求标题字段中所给定的前提条件估计为FALSE。客户机将前提条件放置在当前资源 metainformation（标题字段数据）中，以防止所请求的方法被误用到其他资源。 &lt;br /&gt;
如果问题依然存在，请与 Web 服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 414 &lt;br /&gt;
414 Request-URI 太长 &lt;br /&gt;
Request-URL太长，服务器拒绝服务此请求。仅在下列条件下才有可能发生此条件： &lt;br /&gt;
客户机错误地将 POST 请求转换为具有较长的查询信息的 GET 请求。 &lt;br /&gt;
客户机遇到了重定向问题（例如，指向自身的后缀的重定向前缀）。 &lt;br /&gt;
服务器正遭受试图利用某些服务器（将固定长度的缓冲区用于读取或执行 Request-URI）中的安全性漏洞的客户干扰。 &lt;br /&gt;
如果问题依然存在，请与 Web 服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 500 &lt;br /&gt;
500 服务器的内部错误 &lt;br /&gt;
Web 服务器不能执行此请求。请稍后重试此请求。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 501 &lt;br /&gt;
501 未实现 &lt;br /&gt;
Web 服务器不支持实现此请求所需的功能。请检查URL 中的错误，如果问题依然存在，请与 Web服务器的管理员联系。 &lt;br /&gt;
&lt;br /&gt;
HTTP 错误 502 &lt;br /&gt;
502 网关出错 &lt;br /&gt;
当用作网关或代理时，服务器将从试图实现此请求时所访问的upstream 服务器中接收无效的响应。 &lt;br /&gt;
如果问题依然存在，请与 Web服务器的管理员联系。&lt;/span&gt;
&lt;/p&gt;
            &lt;div&gt;
                作者：web718 发表于2010-1-21 9:24:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/5219195&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：542 评论：1 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/5219195#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944646/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/5219195&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Thu, 21 Jan 2010 09:24:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/5219195</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/5219195</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944646/1059433</fs:itemid></item><item><title>[原]C# 集合类</title><link>http://blog.csdn.net/web718/article/details/5219182</link><description>&lt;p&gt;&lt;strong&gt;HashTable&lt;/strong&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;中的&lt;/span&gt;

key/value&lt;span style=&quot;font-family: 宋体;&quot;&gt;均为&lt;/span&gt;

object&lt;span style=&quot;font-family: 宋体;&quot;&gt;类型，由包含集合元素的存储桶组成。存储桶是&lt;/span&gt;

 HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;中各元素的虚拟子组，与大多数集合中进行的搜索和检索相比，存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联，该哈希代码是使用哈希函数生成的并基于该元素的键。&lt;/span&gt;

HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;的优点就在于其索引的方式，速度非常快。如果以任意类型键值访问其中元素会快于其他集合，特别是当数据量特别大的时候，效率差别尤其大。&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;的应用场合有：做对象缓存，树递归算法的替代，和各种需提升效率的场合。&lt;/span&gt;

&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Hashtable sample&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.Hashtable ht &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Hashtable();&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;--Be careful: Keys can't be duplicated, and can't be null----&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;apple&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;banana&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;orange&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Modify item value:&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;(ht.ContainsKey(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;))&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;] &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;appleBad&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;The following code will return null oValue, no exception&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; oValue &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; ht[&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;];&amp;nbsp; &lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;traversal 1:&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;foreach&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; (DictionaryEntry de &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; ht)&lt;br /&gt;

&lt;img id=&quot;Codehighlighter1_484_563_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_484_563_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_484_563_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_484_563_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;img id=&quot;Codehighlighter1_484_563_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_484_563_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_484_563_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_484_563_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_484_563_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;

&lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_484_563_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(de.Key);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(de.Value);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;traversal 2:&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.IDictionaryEnumerator d &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; ht.GetEnumerator();&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; (d.MoveNext())&lt;br /&gt;

&lt;img id=&quot;Codehighlighter1_682_765_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_682_765_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_682_765_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_682_765_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;img id=&quot;Codehighlighter1_682_765_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_682_765_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_682_765_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_682_765_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_682_765_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;

&lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_682_765_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;key：{0} value：{1}&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, d.Entry.Key, d.Entry.Value);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Clear items&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Clear();&lt;/span&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;

&lt;strong&gt;Dictionary&lt;/strong&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;和&lt;/span&gt;

HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;内部实现差不多，但前者无需装箱拆箱操作，效率略高一点。&lt;br /&gt;

&lt;/span&gt;

&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Dictionary sample&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.Generic.Dictionary&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; fruits &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Generic.Dictionary&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; fruits.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;apple&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; fruits.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;banana&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; fruits.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;orange&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;foreach&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; i &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; fruits.Keys)&lt;br /&gt;

&lt;img id=&quot;Codehighlighter1_282_348_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_282_348_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_282_348_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_282_348_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;img id=&quot;Codehighlighter1_282_348_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_282_348_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_282_348_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_282_348_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_282_348_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;

&lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_282_348_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;key：{0} value：{1}&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;, i, fruits);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; (fruits.ContainsKey(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;))&lt;br /&gt;

&lt;img id=&quot;Codehighlighter1_385_440_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_385_440_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_385_440_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_385_440_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;img id=&quot;Codehighlighter1_385_440_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_385_440_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_385_440_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_385_440_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_385_440_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;

&lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_385_440_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;contain this key.&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;

&lt;/span&gt;

&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ArrayList&lt;/strong&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;是一维变长数组，内部值为&lt;/span&gt;

object&lt;span style=&quot;font-family: 宋体;&quot;&gt;类型，效率一般：&lt;br /&gt;

&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;ArrayList&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ArrayList list &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.ArrayList();&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;object type&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; i &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;

&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;; i &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; list.Count; i&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;++&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;br /&gt;

&lt;img id=&quot;Codehighlighter1_184_227_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_184_227_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_184_227_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_184_227_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;img id=&quot;Codehighlighter1_184_227_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_184_227_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_184_227_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_184_227_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_184_227_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;

&lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_184_227_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(list[i]);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;

&lt;/span&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;

&lt;br /&gt;

HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;是经过优化的，访问下标的对象先散列过，所以内部是无序散列的，保证了高效率，也就是说，其输出不是按照开始加入的顺序，而&lt;/span&gt;

Dictionary&lt;span style=&quot;font-family: 宋体;&quot;&gt;遍历输出的顺序，就是加入的顺序，这点与&lt;/span&gt;

Hashtable&lt;span style=&quot;font-family: 宋体;&quot;&gt;不同。如果一定要排序&lt;/span&gt;

HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;输出，只能自己实现：&lt;br /&gt;

&lt;br /&gt;

&lt;/span&gt;

&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Hashtable sorting&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ArrayList akeys &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.ArrayList(ht.Keys); &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;from Hashtable&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; akeys.Sort(); &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Sort by leading letter&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;foreach&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; skey &lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; akeys)&lt;br /&gt;

&lt;img id=&quot;Codehighlighter1_207_286_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_207_286_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_207_286_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_207_286_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;img id=&quot;Codehighlighter1_207_286_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_207_286_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_207_286_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_207_286_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_207_286_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;

&lt;/span&gt;

&lt;span id=&quot;Codehighlighter1_207_286_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write(skey &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;+&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;:&lt;/span&gt;

&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(ht[skey]);&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;

&lt;/span&gt;

&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;HashTable&lt;/span&gt;

&lt;/strong&gt;

&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;与线程安全&lt;/span&gt;

&lt;/strong&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;：&lt;/span&gt;

&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;为了保证在多线程的情况下的线程同步访问安全，微软提供了自动线程同步的&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;HashTable: &lt;/span&gt;

&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;如果&lt;/span&gt;

 &lt;span lang=&quot;EN-US&quot;&gt;&lt;span id=&quot;highlight_tag&quot;&gt;HashTable&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;要允许并发读但只能一个线程写&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;要这么创建&lt;/span&gt;

 &lt;span lang=&quot;EN-US&quot;&gt;&lt;span id=&quot;highlight_tag&quot;&gt;HashTable&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;实例&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;:&lt;/span&gt;

&lt;/span&gt;

&lt;/span&gt;

&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;Thread safe HashTable&lt;/span&gt;

&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;

&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;

&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.Hashtable htSyn &lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Hashtable.Synchronized(&lt;/span&gt;

&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;

&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Hashtable());&lt;/span&gt;

&lt;/div&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;这样&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;如果有多个线程并发的企图写&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;HashTable&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;里面的&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt; item, &lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;则同一时刻只能有一个线程写&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;, &lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;其余阻塞&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;; &lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;对读的线程则不受影响。&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;另外一种方法就是使用&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;lock&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;语句，但要&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;lock&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;的不是&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;HashTable&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;，而是其&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;SyncRoot&lt;/span&gt;

&lt;span style=&quot;font-family: 宋体;&quot;&gt;；虽然不推荐这种方法，但效果一样的，因为源代码就是这样实现的&lt;/span&gt;

&lt;span lang=&quot;EN-US&quot;&gt;:&lt;/span&gt;

&lt;/p&gt;
&lt;div style=&quot;border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; font-size: 8pt; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;
&lt;div style=&quot;border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//Thread safe&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;


 &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt;


 System.Collections.Hashtable htCache = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;


 System.Collections.Hashtable ();&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;


 &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt;


 &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;


 AccessCache ()&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;{&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;lock&lt;/span&gt;


 ( htCache.SyncRoot )&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    {&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        htCache.Add ( &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;key&amp;quot;&lt;/span&gt;


, &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt;


 );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Be careful: don't use foreach to operation on the whole collection&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Otherwise the collection won't be locked correctly even though indicated locked&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//--by MSDN&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    }&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;}&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//Is equivalent to 等同于 (lock is equivalent to Monitor.Enter and Exit()&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;


 &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt;


 &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;


 AccessCache ()&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;{&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    System.Threading.Monitor.Enter ( htCache.SyncRoot );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    {&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;/* critical section */&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        htCache.Add ( &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;key&amp;quot;&lt;/span&gt;


, &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt;


 );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Be careful: don't use foreach to operation on the whole collection&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Otherwise the collection won't be locked correctly even though indicated locked&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//--by MSDN&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    }&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;finally&lt;/span&gt;


&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    {&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        System.Threading.Monitor.Exit ( htCache.SyncRoot );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    }&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
            &lt;div&gt;
                作者：web718 发表于2010-1-21 9:21:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/5219182&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：59 评论：0 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/5219182#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944645/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/5219182&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Thu, 21 Jan 2010 09:21:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/5219182</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/5219182</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944645/1059433</fs:itemid></item><item><title>[转]C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全</title><link>http://blog.csdn.net/web718/article/details/5105578</link><description>&lt;p&gt;&lt;strong&gt;HashTable&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;中的&lt;/span&gt;
key/value&lt;span style=&quot;font-family: 宋体;&quot;&gt;均为&lt;/span&gt;
object&lt;span style=&quot;font-family: 宋体;&quot;&gt;类型，由包含集合元素的存储桶组成。存储桶是&lt;/span&gt;
 HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;中各元素的虚拟子组，与大多数集合中进行的搜索和检索相比，存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联，该哈希代码是使用哈希函数生成的并基于该元素的键。&lt;/span&gt;
HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;的优点就在于其索引的方式，速度非常快。如果以任意类型键值访问其中元素会快于其他集合，特别是当数据量特别大的时候，效率差别尤其大。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;的应用场合有：做对象缓存，树递归算法的替代，和各种需提升效率的场合。&lt;/span&gt;
&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Hashtable sample&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.Hashtable ht &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Hashtable();&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;--Be careful: Keys can't be duplicated, and can't be null----&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;apple&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;banana&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;orange&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Modify item value:&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;(ht.ContainsKey(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;))&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht[&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;] &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;appleBad&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;The following code will return null oValue, no exception&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; oValue &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; ht[&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;];&amp;nbsp; &lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;traversal 1:&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;foreach&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; (DictionaryEntry de &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; ht)&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_484_563_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_484_563_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_484_563_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_484_563_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;img id=&quot;Codehighlighter1_484_563_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_484_563_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_484_563_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_484_563_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_484_563_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_484_563_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(de.Key);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(de.Value);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;traversal 2:&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.IDictionaryEnumerator d &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; ht.GetEnumerator();&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; (d.MoveNext())&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_682_765_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_682_765_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_682_765_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_682_765_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;img id=&quot;Codehighlighter1_682_765_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_682_765_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_682_765_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_682_765_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_682_765_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_682_765_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;key：{0} value：{1}&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, d.Entry.Key, d.Entry.Value);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Clear items&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ht.Clear();&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Dictionary&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;和&lt;/span&gt;
HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;内部实现差不多，但前者无需装箱拆箱操作，效率略高一点。&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Dictionary sample&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.Generic.Dictionary&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; fruits &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Generic.Dictionary&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fruits.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;apple&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fruits.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;banana&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fruits.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;orange&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;foreach&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; i &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; fruits.Keys)&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_282_348_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_282_348_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_282_348_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_282_348_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;img id=&quot;Codehighlighter1_282_348_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_282_348_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_282_348_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_282_348_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_282_348_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_282_348_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;key：{0} value：{1}&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;, i, fruits);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; (fruits.ContainsKey(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;))&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_385_440_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_385_440_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_385_440_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_385_440_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;img id=&quot;Codehighlighter1_385_440_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_385_440_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_385_440_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_385_440_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_385_440_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_385_440_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;contain this key.&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ArrayList&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;是一维变长数组，内部值为&lt;/span&gt;
object&lt;span style=&quot;font-family: 宋体;&quot;&gt;类型，效率一般：&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;ArrayList&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ArrayList list &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.ArrayList();&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;object type&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; i &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;; i &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; list.Count; i&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;++&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_184_227_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_184_227_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_184_227_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_184_227_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;img id=&quot;Codehighlighter1_184_227_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_184_227_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_184_227_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_184_227_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_184_227_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_184_227_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(list[i]);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;是经过优化的，访问下标的对象先散列过，所以内部是无序散列的，保证了高效率，也就是说，其输出不是按照开始加入的顺序，而&lt;/span&gt;
Dictionary&lt;span style=&quot;font-family: 宋体;&quot;&gt;遍历输出的顺序，就是加入的顺序，这点与&lt;/span&gt;
Hashtable&lt;span style=&quot;font-family: 宋体;&quot;&gt;不同。如果一定要排序&lt;/span&gt;
HashTable&lt;span style=&quot;font-family: 宋体;&quot;&gt;输出，只能自己实现：&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Hashtable sorting&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.ArrayList akeys &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.ArrayList(ht.Keys); &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;from Hashtable&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; akeys.Sort(); &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Sort by leading letter&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;foreach&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; skey &lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; akeys)&lt;br /&gt;
&lt;img id=&quot;Codehighlighter1_207_286_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_207_286_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_207_286_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_207_286_Closed_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;img id=&quot;Codehighlighter1_207_286_Closed_Image&quot; style=&quot;display: none;&quot; onclick=&quot;this.style.display='none'; document.getElementById('Codehighlighter1_207_286_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_207_286_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_207_286_Open_Text').style.display='inline';&quot; src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_207_286_Closed_Text&quot; style=&quot;border: 1px solid #808080; display: none; background-color: #ffffff;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; alt=&quot;&quot; /&gt;
&lt;/span&gt;
&lt;span id=&quot;Codehighlighter1_207_286_Open_Text&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Write(skey &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;+&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;:&lt;/span&gt;
&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(ht[skey]);&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;HashTable&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;与线程安全&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;：&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;为了保证在多线程的情况下的线程同步访问安全，微软提供了自动线程同步的&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;HashTable: &lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;如果&lt;/span&gt;
 &lt;span lang=&quot;EN-US&quot;&gt;&lt;span id=&quot;highlight_tag&quot;&gt;HashTable&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;要允许并发读但只能一个线程写&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;要这么创建&lt;/span&gt;
 &lt;span lang=&quot;EN-US&quot;&gt;&lt;span id=&quot;highlight_tag&quot;&gt;HashTable&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;实例&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div style=&quot;border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;&quot;&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;Thread safe HashTable&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; alt=&quot;&quot; align=&quot;top&quot; /&gt;
&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Collections.Hashtable htSyn &lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Hashtable.Synchronized(&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt; System.Collections.Hashtable());&lt;/span&gt;
&lt;/div&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;这样&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;如果有多个线程并发的企图写&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;HashTable&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;里面的&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt; item, &lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;则同一时刻只能有一个线程写&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;, &lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;其余阻塞&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;; &lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;对读的线程则不受影响。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;另外一种方法就是使用&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;lock&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;语句，但要&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;lock&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;的不是&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;HashTable&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;，而是其&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;SyncRoot&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;；虽然不推荐这种方法，但效果一样的，因为源代码就是这样实现的&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;div style=&quot;border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; font-size: 8pt; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;
&lt;div style=&quot;border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//Thread safe&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;
 &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt;
 System.Collections.Hashtable htCache = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;
 System.Collections.Hashtable ();&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;
 &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt;
 &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;
 AccessCache ()&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;{&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;lock&lt;/span&gt;
 ( htCache.SyncRoot )&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    {&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        htCache.Add ( &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;key&amp;quot;&lt;/span&gt;
, &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt;
 );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Be careful: don't use foreach to operation on the whole collection&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Otherwise the collection won't be locked correctly even though indicated locked&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//--by MSDN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    }&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;}&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//Is equivalent to 等同于 (lock is equivalent to Monitor.Enter and Exit()&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;
 &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt;
 &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;
 AccessCache ()&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;{&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    System.Threading.Monitor.Enter ( htCache.SyncRoot );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    {&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;/* critical section */&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        htCache.Add ( &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;key&amp;quot;&lt;/span&gt;
, &lt;span style=&quot;color: #006080;&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt;
 );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Be careful: don't use foreach to operation on the whole collection&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//Otherwise the collection won't be locked correctly even though indicated locked&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//--by MSDN&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    }&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;finally&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    {&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;        System.Threading.Monitor.Exit ( htCache.SyncRoot );&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;&quot;&gt;    }&lt;/pre&gt;
&lt;pre style=&quot;border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;&quot;&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
            &lt;div&gt;
                作者：web718 发表于2009-12-30 13:18:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/5105578&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：363 评论：1 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/5105578#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944644/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/5105578&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Wed, 30 Dec 2009 13:18:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/5105578</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/5105578</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944644/1059433</fs:itemid></item><item><title>[原][AsyncHandle]什么引发了ObjectDisposedException？</title><link>http://blog.csdn.net/web718/article/details/4983752</link><description>&lt;table class=&quot;MsoNormalTable&quot; style=&quot;border: medium none; margin: auto auto auto 14.75pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 10.9pt;&quot;&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #9faccb none repeat scroll 0% 0%; width: 96.15pt; height: 10.9pt; border: 1pt medium 1pt 1pt solid none solid solid white #ece9d8 white white;&quot; width=&quot;128&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: white; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;Version&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;border: 1pt solid white; padding: 0.7pt 5.75pt; background: #9faccb none repeat scroll 0% 0%; width: 94.7pt; height: 10.9pt;&quot; width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: white; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;Date&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #9faccb none repeat scroll 0% 0%; width: 106.15pt; height: 10.9pt; border: 1pt 1pt 1pt medium solid solid solid none white white white #ece9d8;&quot; width=&quot;142&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: white; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;Creator&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #9faccb none repeat scroll 0% 0%; width: 115.05pt; height: 10.9pt; border: 1pt 1pt 1pt medium solid solid solid none white white white #ece9d8;&quot; width=&quot;153&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: white; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;Description&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15.45pt;&quot;&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 96.15pt; height: 15.45pt; border: medium medium 1pt 1pt none none solid solid #ece9d8 #ece9d8 white white;&quot; width=&quot;128&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;1.0.0&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;.1&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 94.7pt; height: 15.45pt; border: medium 1pt 1pt none solid solid #ece9d8 white white;&quot; width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;2006-9-19&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 106.15pt; height: 15.45pt; border: medium 1pt 1pt medium none solid solid none #ece9d8 white white #ece9d8;&quot; width=&quot;142&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;郑昀&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 115.05pt; height: 15.45pt; border: medium 1pt 1pt medium none solid solid none #ece9d8 white white #ece9d8;&quot; width=&quot;153&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;草稿&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt 24pt;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt 24pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;继续阅读之前，我们假设您熟悉以下知识：&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt 66pt; text-indent: -21pt;&quot;&gt;&lt;span style=&quot;color: green; font-family: Wingdings;&quot; lang=&quot;EN-US&quot;&gt;&lt;span&gt;n&lt;span style=&quot;font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: green; font-family: 宋体;&quot;&gt;用&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: green; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;IDisposable&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: green; font-family: 宋体;&quot;&gt;接口释放&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: green; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;dotNET&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: green; font-family: 宋体;&quot;&gt;资源&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: green; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;如果不熟悉这些知识点，可以看本文最后资源列表中的文章。&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt 21pt;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;a href=&quot;http://blog.csdn.net/zhengyun_ustc/archive/2006/09/19/1246115.aspx&quot;&gt;&lt;span style=&quot;color: #800080;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot; lang=&quot;EN-US&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;本文讨论了出现不可捕获的&lt;/span&gt;
&lt;/span&gt;
&lt;strong&gt;&lt;span&gt;ObjectDisposedException&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot; lang=&quot;EN-US&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;异常崩溃，寻找可能的原因&lt;span lang=&quot;EN-US&quot;&gt;，并试图解决&lt;span lang=&quot;EN-US&quot;&gt;。&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/a&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;h3 style=&quot;margin: 13pt 0cm;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;[&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;现象&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;]&lt;/span&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;关键词&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;：&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;ObjectDisposedException&lt;/span&gt;
&lt;/strong&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;。&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;表象&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;：&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;我的&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;dotNET C#&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;服务偶尔会彻底崩溃，时机没有规律可循，崩溃时在&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Windows&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;事件日志中有来自于&amp;ldquo;&lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: red;&quot; lang=&quot;EN-US&quot;&gt;.NET Runtime 2.0 Error Reporting&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;&amp;rdquo;的报告，描述的错误也颇让人费思量。&lt;/span&gt;
 &lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;错误描述&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;：&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;事件类型&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;:&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;错误&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;事件来源&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;:&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
.NET Runtime 2.0 Error Reporting&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;事件种类&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;:&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;无&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;事件&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt; ID:&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
5000&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;描述&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;:&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;EventType clr20r3, P1 juiceextractor.exe, P2 1.0.0.0, P3 450d5160, P4 mscorlib, P5 2.0.0.0, P6 4333ab80, P7 10ed, P8 0, P9&lt;span style=&quot;color: red;&quot;&gt; system.objectdisposedexception&lt;/span&gt;
, P10 NIL.&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;通过&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;ObjectDisposedException&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;对我们的提醒，可以了解到这是因为前面已经使用了一个&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;disposed&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;对象。在一个使用过&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;disposed&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;对象上调用其他方法时是会引发致命异常的，服务也不知道该在哪里捕获这个异常，似乎也不可捕获。但是，问题是，是谁引发的？&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;引申&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;：&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;看到微软的一个对&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;dotnet framework&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;的&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;servicepack&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;公告中提到：当一个异步&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Web &lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;请求在接收到响应之前如果被中止，则会引发&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;ObjectDisposedException&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;。&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;唯一和异步请求有点关系的是，本服务向一个&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;服务器发送请求，并等候一段一段地循环接收服务器的大量数据反馈。这中间，使用了&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;C#&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;的异步方法&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;BeginReceive&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;来告知&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;如何接收数据。&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;这个逻辑的代码如下：&lt;/span&gt;
&lt;/p&gt;
&lt;table class=&quot;MsoNormalTable&quot; style=&quot;border: medium none; margin: auto auto auto 23.75pt; width: 90%; border-collapse: collapse;&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 10.9pt;&quot;&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #9faccb none repeat scroll 0% 0%; width: 387pt; height: 10.9pt; border: 1pt medium 1pt 1pt solid none solid solid white #ece9d8 white white;&quot; width=&quot;516&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: center;&quot; align=&quot;center&quot;&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;C# code&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15.45pt;&quot;&gt;
&lt;td style=&quot;padding: 0.7pt 5.75pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 387pt; height: 15.45pt; border: medium medium 1pt 1pt none none solid solid #ece9d8 #ece9d8 white white;&quot; width=&quot;516&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;/// &lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;调用异步方法&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;BeginReceive&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;来告知&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;如何接收数据&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;IAsyncResult ar = &lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21.1pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;_socket.BeginReceive(_recvBuffer.Buffer, 0, _recvBuffer.Buffer.Length,&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;span&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; &lt;/span&gt;
SocketFlags.None, _recvCallback, _socket);&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;// &lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;设定一个期限，&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;10&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;分钟内如果还没有结果返回，&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;// &lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;我们可以认为必须关掉当前&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: 宋体;&quot;&gt;连接了，不要再等了&lt;/span&gt;
&lt;/strong&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;!&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;ar.AsyncWaitHandle.WaitOne(new TimeSpan(0, 10, 0), true);&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;ar.AsyncWaitHandle.Close();&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&amp;hellip;.&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;public void RecvCallback(IAsyncResult result)&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;{&amp;hellip;&lt;/span&gt;
&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;也就是利用回调函数&lt;/span&gt;
 &lt;span style=&quot;font-family: 宋体;&quot;&gt;&amp;ldquo;&lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;_recvCallback&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;&amp;rdquo;，每次有数据的话，都直接调用它。但是，规定了如果&lt;/span&gt;
&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;10&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;分钟内都没有完整结果返回，那么这个异步等候句柄将被关闭。&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;很简单的想法。&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;但是如果数据量大的话，&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;服务器计算的过程非常漫长，导致返回数据的过程超过了&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;10&lt;/span&gt;
&lt;/span&gt;
&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;分钟，会发生什么事情呢？&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;h3 style=&quot;margin: 13pt 0cm;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;[&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;回答前面的问题&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;]&lt;/span&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;这个时候，&amp;ldquo;&lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;ar.AsyncWaitHandle.Close();&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;&amp;rdquo;是不是就导致了&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;ObjectDisposedException&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;呢？&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;假设如此的话。&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;第一，那我们需要调用&lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;AsyncWaitHandle.Close()&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;这句话吗？&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;a href=&quot;http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml&quot;&gt;&lt;span style=&quot;color: #800080;&quot;&gt;The Thread Pool and Asynchronous Methods&lt;/span&gt;
&lt;/a&gt;
&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;中说道：&amp;ldquo;&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;Note the call to &lt;/span&gt;
&lt;code&gt;&lt;span style=&quot;font-size: 12pt;&quot; lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;ar.AsyncWaitHandle.Close()&lt;/span&gt;
&lt;/span&gt;
&lt;/code&gt;
&lt;span lang=&quot;EN-US&quot;&gt;. This prevents the &lt;/span&gt;
&lt;code&gt;&lt;span style=&quot;font-size: 12pt;&quot; lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;WaitHandle&lt;/span&gt;
&lt;/span&gt;
&lt;/code&gt;
&lt;span lang=&quot;EN-US&quot;&gt;
leaking until garbage collection. The leak wouldn't cause any problems
in most cases (unlike, for instance, file handles leaking), but in
situations where &lt;/span&gt;
&lt;code&gt;&lt;span style=&quot;font-size: 12pt;&quot; lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;FireAndForget&lt;/span&gt;
&lt;/span&gt;
&lt;/code&gt;
&lt;span lang=&quot;EN-US&quot;&gt;
would be called many, many times in quick succession, you could end up
with a vast number of handles until the garbage collector started
finalizing them. (This is also a bad thing in terms of performance -
you shouldn't leave things to be finalised when it can be avoided.)&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;&amp;rdquo;&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;那么，也许我们可以不调用它，来规避&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;ObjectDisposedException&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;异常崩溃？&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;第二，把&lt;/span&gt;
&lt;strong&gt;&lt;span style=&quot;color: red; font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;ar.AsyncWaitHandle.WaitOne(new TimeSpan(0, 10, 0), true);&lt;/span&gt;
&lt;/strong&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;等候的时间延长？比如说延长到&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;40&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;分钟。这样也可以避免&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;ObjectDisposedException&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;。&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 style=&quot;margin: 13pt 0cm;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;[&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;改变接收模式&lt;/span&gt;
&lt;span lang=&quot;EN-US&quot;&gt;]&lt;/span&gt;
&lt;/span&gt;
&lt;/h3&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;第三，对于这种长时间执行的&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;服务器，可以不用在一个端口上干等，可以发送请求用一个端口，接收数据反馈用另外一个&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;端口号。&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;以前没有考虑到计算时间如此之长，所以才做成了&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;socket&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;异步接收模式。后来算法作了改变，有时候十分钟的等候都不够了。&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h3 style=&quot;margin: 13pt 0cm;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;
[&lt;/span&gt;
&lt;span style=&quot;font-family: 宋体;&quot;&gt;参考资料&lt;/span&gt;
&lt;span style=&quot;font-family: Arial;&quot; lang=&quot;EN-US&quot;&gt;]&lt;/span&gt;
&lt;/span&gt;
&lt;/h3&gt;
            &lt;div&gt;
                作者：web718 发表于2009-12-11 9:02:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4983752&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：380 评论：0 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4983752#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944643/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/4983752&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Fri, 11 Dec 2009 09:02:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/4983752</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/4983752</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944643/1059433</fs:itemid></item><item><title>[原]利用 squid 反向代理提高网站性能</title><link>http://blog.csdn.net/web718/article/details/4789112</link><description>&amp;nbsp;
&lt;blockquote&gt;本文在介绍 squid 反向代理的工作原理的基础上，指出反向代理技术在提高网站访问速度，增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下，利用 DNS 轮询和 Squid 反向代理技术，实现了网站的负载均衡，从而提高了网站的可用性和可靠性。&lt;/blockquote&gt;
&lt;!-- START RESERVED FOR FUTURE USE INCLUDE FILES--&gt;&lt;!--  include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --&gt;
&lt;!-- END RESERVED FOR FUTURE USE INCLUDE FILES--&gt;
&lt;p&gt;本文在介绍 squid 反向代理的工作原理的基础上，指出反向代理技术在提高网站访问速度，增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下，利用 DNS 轮询和 Squid 反向代理技术，实现了网站的负载均衡，从而提高了网站的可用性和可靠性。&lt;/p&gt;
&lt;p&gt;现在有许多大型的门户网站如 SINA 都采用 squid 反向代理技术来加速网站的访问速度，可将不同的 URL 请求分发到后台不同的 WEB 服务器上，同时互联网用户只能看到反向代理服务器的地址，加强了网站的访问安全。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;1.反向代理的概念&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;反向代理的概念&lt;/span&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;反向代理服务器又称为 WEB 加速服务器，它位于 WEB 服务器的前端，充当 WEB 服&lt;/p&gt;
&lt;p&gt;务器的内容缓存器。其系统结构如图 1&lt;/p&gt;
&lt;p&gt;
				&lt;br /&gt;
&lt;a name=&quot;N10061&quot;&gt;&lt;strong&gt;图 1. 系统结构&lt;/strong&gt;
&lt;/a&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/developerworks/cn/linux/l-cn-squid/images/image001.jpg&quot; alt=&quot;系统结构&quot; width=&quot;380&quot; height=&quot;352&quot; /&gt;&lt;/p&gt;
&lt;p&gt;反
向代理服务器是针对 WEB 服务器设置的，后台 WEB 服务器对互联网用户是透明的，用户只能看到反向代理服务器的地址，不清楚后台 WEB
服务器是如何组织架构的。当互联网用户请求 WEB 服务时，DNS 将请求的域名解析为反向代理服务器的 IP 地址，这样 URL
请求将被发送到反向代理服务器，由反向代理服务器负责处理用户的请求与应答、与后台 WEB 服务器交互。利用反向代理服务器减轻了后台 WEB
服务器的负载，提高了访问速度，同时避免了因用户直接与 WEB 服务器通信带来的安全隐患。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; alt=&quot;&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/i/c.gif&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&quot;no-print&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;right&quot;&gt;
&lt;tbody&gt;
&lt;tr align=&quot;right&quot;&gt;
&lt;td&gt;&lt;img src=&quot;http://www.ibm.com/i/c.gif&quot; alt=&quot;&quot; width=&quot;100%&quot; height=&quot;4&quot; /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;middle&quot;&gt;&lt;img src=&quot;http://www.ibm.com/i/v14/icons/u_bold.gif&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;
&lt;br /&gt;
&lt;/td&gt;
&lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;&lt;a class=&quot;fbox&quot; href=&quot;http://www.ibm.com/developerworks/cn/linux/l-cn-squid/index.html#main&quot; class=&quot;fbox&quot;&gt;&lt;strong&gt;回页首&lt;/strong&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;2.Squid 反向代理的实现原理&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Squid 反向代理的实现原理&lt;/span&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;目
前有许多反向代理软件，比较有名的有 Nginx 和 Squid 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的
Rambler.ru 站点开发的，是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Squid&lt;/code&gt;
&lt;code&gt;
				&lt;/code&gt;
是由美国政府大力资助的一项研究计划，其目的为解决网络带宽不足的问题，支持&lt;code&gt;HTTP&lt;/code&gt;
，HTTPS，FTP 等多种协议，是现在 Unix 系统上使用、最多功能也最完整的一套软体。下面将重点介绍 Squid 反向代理的实现原理和在提高网站性能方面的应用。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Squid&lt;/code&gt;
反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如图 2：&lt;/p&gt;
&lt;p&gt;
				&lt;br /&gt;
&lt;a name=&quot;N1008E&quot;&gt;&lt;strong&gt;图 2. 组织架构&lt;/strong&gt;
&lt;/a&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/developerworks/cn/linux/l-cn-squid/images/image002.jpg&quot; alt=&quot;组织架构&quot; width=&quot;419&quot; height=&quot;414&quot; /&gt;&lt;/p&gt;
&lt;p&gt;客
户端请求访问 WEB 服务时，DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址，这样客户端的 URL
请求将被发送到反向代理服务器。如果 Squid
反向代理服务器中缓存了该请求的资源，则将该请求的资源直接返回给客户端，否则反向代理服务器将向后台的 WEB
服务器请求资源，然后将请求的应答返回给客户端，同时也将该应答缓存在本地，供下一个请求者使用。&lt;/p&gt;
&lt;p&gt;Squid 反向代理一般只缓存可缓冲的数据（比如 html 网页和图片等），而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Last-Modified: 告诉反向代理页面什么时间被修改&lt;/li&gt;
&lt;li&gt;Expires: 告诉反向代理页面什么时间应该从缓冲区中删除&lt;/li&gt;
&lt;li&gt;Cache-Control: 告诉反向代理页面是否应该被缓冲&lt;/li&gt;
&lt;li&gt;Pragma: 用来包含实现特定的指令，最常用的是 Pragma:no-c&lt;code&gt;ache&lt;/code&gt;
&lt;code&gt;
					&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.ibm.com/i/v14/rules/blue_rule.gif&quot; alt=&quot;&quot; width=&quot;100%&quot; height=&quot;1&quot; /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/i/c.gif&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;8&quot; height=&quot;6&quot; /&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class=&quot;no-print&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;right&quot;&gt;
&lt;tbody&gt;
&lt;tr align=&quot;right&quot;&gt;
&lt;td&gt;&lt;img src=&quot;http://www.ibm.com/i/c.gif&quot; alt=&quot;&quot; width=&quot;100%&quot; height=&quot;4&quot; /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;middle&quot;&gt;&lt;img src=&quot;http://www.ibm.com/i/v14/icons/u_bold.gif&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;
&lt;br /&gt;
&lt;/td&gt;
&lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;&lt;a class=&quot;fbox&quot; href=&quot;http://www.ibm.com/developerworks/cn/linux/l-cn-squid/index.html#main&quot; class=&quot;fbox&quot;&gt;&lt;strong&gt;回页首&lt;/strong&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;3.利用 Squid 反向代理加速网站实例&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;利用 Squid 反向代理加速网站实例&lt;/span&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;本实例的域名是 wenjin.cache.&lt;code&gt;ibm.com.cn&lt;/code&gt;
，通过&lt;code&gt;DNS&lt;/code&gt;
的
轮询技术，将客户端的请求分发给其中一台 Squid 反向代理服务器处理，如果这台 Squid
缓存了用户的请求资源，则将请求的资源直接返回给用户，否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的
WEB 服务器处理，这样既减轻后台 WEB 服务器的负载，又提高整个网站的性能和安全性。该系统结构图 3 如下：&lt;/p&gt;
&lt;p&gt;
				&lt;br /&gt;
&lt;a name=&quot;N100C7&quot;&gt;&lt;strong&gt;图 3. 系统结构&lt;/strong&gt;
&lt;/a&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/developerworks/cn/linux/l-cn-squid/images/image003.jpg&quot; alt=&quot;系统结构&quot; width=&quot;504&quot; height=&quot;378&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N100D4&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;配置的系统环境：&lt;/span&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一台 DNS 服务器：操作系统 Freebsd，软件 BIND 9.5，IP 192.168.76.222 ；&lt;/li&gt;
&lt;li&gt;三台 Squid 服务器：操作系统 Linux AS 4，软件 Squid 3.0，相应的 IP 如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;Squid1：192.168.76.223 &lt;br /&gt;
 Squid2：192.168.76.224 &lt;br /&gt;
 Squid3：192.168.76.225&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三台 WEB 服务器：操作系统 Linux AS 4，应用软件 Tomcat 5.0+Mysql，相应的 IP 地址如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;webServer1：210.82.118.195 &lt;br /&gt;
 webServer2：192.168.76.226 &lt;br /&gt;
 webServer1：192.168.76.227&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N100F0&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;应用软件的安装和配置&lt;/span&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置 DNS 服务器&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;软件利用 Freebsd 自带的 bind 9.5 。然后针对该系统配置 bind，首先修改 bind 的配置文件 /etc/namedb/named.conf，在文件中添加&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;zone &amp;quot;cache.ibm.com.cn&amp;quot;{ &lt;br /&gt;
        type master; &lt;br /&gt;
        file &amp;quot;master/ cache.ibm.com.cn &amp;quot;; &lt;br /&gt;
 };&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;再在 /etc/namedb/master 目录下添加 cache.ibm.com.cn 文件，该文件的内容如下：&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;$TTL    3600 &lt;br /&gt;
 @       IN      SOA     search. ibm.com.cn. root. ibm.com.cn.  ( &lt;br /&gt;
                                20080807        ; Serial &lt;br /&gt;
                                3600    ; Refresh &lt;br /&gt;
                                900     ; Retry &lt;br /&gt;
                                3600000 ; Expire &lt;br /&gt;
                                3600 )  ; Minimum &lt;br /&gt;
        IN      NS      search.ibm.com.cn. &lt;br /&gt;
 1       IN      PTR     localhost.ibm.com.cn. &lt;br /&gt;
 wenjin  IN      A       192.168.76.223 &lt;br /&gt;
 wenjin  IN      A       192.168.76.224 &lt;br /&gt;
 wenjin  IN      A       192.168.76.225&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;这样当用户请求的时候，DNS 通过轮询机制将 wenjin.cache.ibm.com.cn 的域名解析为 192.168.76.223、192.168.76.224 和 192.168.76.225 其中之一。&lt;/p&gt;
&lt;p&gt;配置完成后，运行 rndc star t 启动 bind 服务。可在 /etc/rc.conf 中设置 named_enable=&amp;quot;YES&amp;quot; 使得开机自启动。&lt;/p&gt;
&lt;p&gt;用 ps &amp;ndash; A |grep named  查看 bind 服务是否起来；&lt;/p&gt;
&lt;p&gt;用 nslookup wenjin.cache.ibm.com.cn  测试 bind 服务是否正常运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置 Squid1 服务器&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载 squid-3.0.STABLE8.tar.gz 源码包，将其放在 /home 目录下&lt;/li&gt;
&lt;li&gt;解压缩&lt;code&gt;tar &amp;ndash; zxvf squid-3.0.STABLE8.tar.gz&lt;/code&gt;
					&lt;br /&gt;
设置配置参数：&lt;code&gt;cd squid-3.0.STABLE10&lt;/code&gt;
					&lt;br /&gt;
					
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;./configure &amp;ndash; prefix=/usr/local/squid&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
将 squid 安装在 /usr/local 目录下&lt;/li&gt;
&lt;li&gt;编译安装：&lt;code&gt;make&amp;amp;make install&lt;/code&gt;
安装完以后会在 /usr/local 目录下看见 squid 目录。&lt;/li&gt;
&lt;li&gt;配置 squid 配置文件
&lt;p&gt;编辑 squid.conf  文件，&lt;code&gt;vi /usr/local/squid/etc/squid.conf&lt;/code&gt;
&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;cache_effective_user squid &lt;br /&gt;
 cache_effective_group squid &lt;br /&gt;
 ######### 设定 squid 的主机名 , 如无此项 squid 将无法启动&lt;br /&gt;
 visible_hostname squid1.nlc.gov.cn &lt;br /&gt;
 ############# 配置 squid 为加速模式 ################# &lt;br /&gt;
 http_port 80 accel vhost vport &lt;br /&gt;
 icp_port 3130 &lt;br /&gt;
 ##### 配置 squid2、squid3 为其邻居，当 squid1 在其缓存中没有找到请求的资源时，&lt;br /&gt;
          通过 ICP 查询去其邻居中取得缓存&lt;br /&gt;
 cache_peer squid2.ibm.com.cn sibling 80 3130 &lt;br /&gt;
 cache_peer squid3.ibm.com.cn sibling 80 3130 &lt;br /&gt;
 ##### squid1 的三个父节点，originserver 参数指明是源服务器，&lt;br /&gt;
 round-robin  参数指明 squid 通过轮询方式将请求分发到其中一台父节点；&lt;br /&gt;
 squid 同时会对这些父节点的健康状态进行检查，如果父节点 down 了，&lt;br /&gt;
那么 squid 会从剩余的 origin 服务器中抓取数据&lt;br /&gt;
 cache_peer 210.82.118.195 parent 8080 0 no-query originserver round-robin / &lt;br /&gt;
                                              name=webServer1 &lt;br /&gt;
 cache_peer 192.168.76.226 parent 8080 0 no-query originserver round-robin / &lt;br /&gt;
                                              name=webServer2 &lt;br /&gt;
 cache_peer 192.168.76.227 parent 8080 0 no-query originserver round-robin / &lt;br /&gt;
                                            name=webServer3 &lt;br /&gt;
 #### 将 wenjin.cache.ibm.com.cn 域的请求通过 RR 轮询方式转发到三个父节点中的一个&lt;br /&gt;
 cache_peer_domain webServer1 webServer2 webServer3 wenjin.cache.ibm.com.cn &lt;br /&gt;
 ##### 下面是一些访问控制、日志和缓存目录的设置&lt;br /&gt;
 acl localnet src 192.168.76.223 192.168.76.224 192.168.76.225 &lt;br /&gt;
 acl all src 0.0.0.0/0.0.0.0 &lt;br /&gt;
 http_access allow all &lt;br /&gt;
 icp_access allow localnet &lt;br /&gt;
 cache_log /usr/local/squid/var/logs/cache.log &lt;br /&gt;
 access_log /usr/local/squid/var/logs/access.log squid &lt;br /&gt;
 cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256 &lt;br /&gt;
 ####### 对 squid 的一些优化 ############### &lt;br /&gt;
 maximum_object_size 10240 KB  ### 能缓存的最大对象为 10M &lt;br /&gt;
 maximum_object_size_in_memory 512 KB ### 内存中缓存的最大对象 512K &lt;br /&gt;
 cache_mem 256 MB  ###squid 用于缓存的内存量&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p&gt;保存后 :wq 退出。&lt;/p&gt;
&lt;p&gt;在 /etc/hosts 文件中添加&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;192.168.76.223  squid1.ibm.com.cn &lt;br /&gt;
 192.168.76.224  squid2.ibm.com.cn &lt;br /&gt;
 192.168.76.225  squid3.ibm.com.cn&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p&gt;保存后 : wq 退出。&lt;/p&gt;
&lt;p&gt;检查 squid 配置文件正确与否：&lt;code&gt;/usr/local/squid/bin/squid &amp;ndash; k parse&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;生成缓存目录&lt;code&gt;/usr/local/squid/bin/squid &amp;ndash; z&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;启动&lt;code&gt;squid：/usr/local/squid/bin/squid&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置 squid2 和 squid3 服务器&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;squid2 和 squid3 服务器的配置方法和配置参数和 squid1 一样，配置完成后，分别启动这两个服务器上的 squid 服务。&lt;/p&gt;
&lt;p&gt;在 squid 的日志文件 cache.log 中，出现如下日志信息则说明三台 squid 之间成功配置为 sibling，且配置了三个父代理。&lt;/p&gt;
&lt;table style=&quot;width: 100%;&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;code-outline&quot;&gt;
&lt;pre class=&quot;displaycode&quot;&gt;2008/11/17 10:08:47| Configuring Sibling squid1.ibm.com.cn/80/3130 &lt;br /&gt;
 2008/11/17 10:08:47| Configuring Sibling squid3.ibm.com.cn/80/3130 &lt;br /&gt;
 2008/11/17 10:08:47| Configuring Parent 210.82.118.195/8080/0 &lt;br /&gt;
 2008/11/17 10:08:47| Configuring Parent 192.168.76.226/8080/0 &lt;br /&gt;
 2008/11/17 10:08:47| Configuring Parent 192.168.76.227/8080/0 &lt;br /&gt;
 2008/11/17 10:08:47| Ready to serve requests.&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;测试&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;测试之前，保证 DNS 服务、三台 squid 服务和三台 web 服务都正常起来。在客户端输入&lt;a href=&quot;http://wenjin.cache.nlc.gov.cn/&quot;&gt;http://wenjin.cache.ibm.com.cn&lt;/a&gt;
，则正确的显示该网页。服务器端的响应对客户端是透明的，客户端不知道请求是由哪台 WEB 服务器处理的；而且其中某台 Squid 服务器或 WEB 服务器发生故障，也不影响服务的正常运行。&lt;/p&gt;
            &lt;div&gt;
                作者：web718 发表于2009-11-9 11:53:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4789112&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：104 评论：0 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4789112#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944642/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/4789112&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Mon, 09 Nov 2009 11:53:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/4789112</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/4789112</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944642/1059433</fs:itemid></item><item><title>[原]多服务器负载均衡引起上传数据存储问题</title><link>http://blog.csdn.net/web718/article/details/4377577</link><description>&lt;p&gt;描述：&lt;br /&gt;在中国移动部署M校园项目时，其中WEB使用了2台负载均衡服务器。并且没有外网的IP,外部是无法识别其中的一台。网站会员有很多的上传操作。如上传文件，上传视频，上传照片.&lt;/p&gt;
&lt;p&gt;需要解决的问题：文件不能直接上传在WEB服务器。因为上传的时候是上传在其中的一台。另外一台没有物理文件。访问其中一台会找不到资源。&lt;/p&gt;
&lt;p&gt;解决办法:&lt;/p&gt;
&lt;p&gt;增加一台文件服务器&lt;br /&gt;将数据上传到存储文件的服务器上,使用Url转向服务器实现上传的操作&lt;/p&gt;
&lt;p&gt;也可以使用以下其它的方式：&lt;br /&gt;1.post发送,直接使用Form表单发送到文件服务器 (文件较小的时候使用)&lt;br /&gt;2.WebService发送. (文件较小的时候使用)&lt;br /&gt;3.xcopy&lt;br /&gt;4.rsync&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
            &lt;div&gt;
                作者：web718 发表于2009-7-24 17:16:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4377577&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：187 评论：1 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4377577#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944641/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/4377577&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Fri, 24 Jul 2009 17:16:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/4377577</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/4377577</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944641/1059433</fs:itemid></item><item><title>[原]asp.net 控制windows服务</title><link>http://blog.csdn.net/web718/article/details/4374620</link><description>&lt;p&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;1、为网站添加新的引用，加入：system.serviceproces.dll&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt; 2、在代码文件头部加如：using System.ServiceProcess;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt; 3、服务的启动使用如下代码：&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceController sc = new ServiceController(&amp;quot;service1&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sc.Status == ServiceControllerStatus.Stopped)&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; sc.Start();&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; 4、服务的关闭使用如下代码：&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceController sc = new ServiceController(&amp;quot;service1&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sc.Status == ServiceControllerStatus.Running)&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; sc.Stop();&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; 5、服务的控制权限的解决办法&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
windows2003等服务器系统都提供了完善的权限访问机制，这就是我为什么不用前面说过的在asp.net 中调用另一个程序的办法来通过net
命令启动和停止服务。因为首先用net命令显然比较麻烦，而调用新进程的发放程序运行依然是在aspnet的用户下（通过网页访问的默认用户），当网页关
闭，会话结束时间到达就会自动释放该用户运行的相关程序。而net命令同样需要相应权限。asp.net 中可以在web.config的下添加&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 从而解决用户的登入权限问题。&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以上五步就可以完成对服务器服务的控制了！&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 宋体;&quot;&gt;&amp;lt;system.web&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;identity impersonate=&amp;quot;true&amp;quot; userName=&amp;quot;admin&amp;quot; password=&amp;quot;admin&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
            &lt;div&gt;
                作者：web718 发表于2009-7-23 17:36:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4374620&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：312 评论：1 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4374620#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944640/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/4374620&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Thu, 23 Jul 2009 17:36:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/4374620</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/4374620</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944640/1059433</fs:itemid></item><item><title>[原]System.Web.HttpUtility.UrlEncode编码转换</title><link>http://blog.csdn.net/web718/article/details/4233767</link><description>&lt;div id=&quot;blog_text&quot; class=&quot;cnt&quot;&gt;
&lt;p&gt;今天在做一个小程序发现C#的System.Web.HttpUtility.UrlEncode函数产生的编码和我们正常使用的有出入，如：&lt;/p&gt;
&lt;p&gt;用System.Web.HttpUtility.UrlEncode产生的编码如下&lt;/p&gt;
&lt;p&gt;南京：%e5%8d%97%e4%ba%ac&lt;/p&gt;
&lt;p&gt;而正常的我们期待的结果是：%C4%CF%BE%A9&lt;/p&gt;
&lt;p&gt;比较后发现两者前者认为一个汉字3个字节，而后者则是两个字节，这下恍然大悟原来在C#中如果直接用System.Web.HttpUtility.UrlEncode(&amp;quot;南京&amp;quot;)则程序用UTF-8编码处理汉字。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;p&gt;System.Web.HttpUtility.UrlEncode(&amp;quot;南京&amp;quot;,Encoding.GetEncoding(&amp;quot;GB2312&amp;quot;))&lt;/p&gt;
&lt;p&gt;加一个参数即可！&lt;/p&gt;
&lt;/div&gt;
            &lt;div&gt;
                作者：web718 发表于2009-6-1 18:10:00 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4233767&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：884 评论：0 &lt;a href=&quot;http://blog.csdn.net/web718/article/details/4233767#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/641944639/web718/csdn.net/s.gif?r=http://blog.csdn.net/web718/article/details/4233767&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Mon, 01 Jun 2009 18:10:00 +0800</pubDate><author>web718</author><guid isPermaLink="false">http://blog.csdn.net/web718/article/details/4233767</guid><dc:creator>web718</dc:creator><fs:srclink>http://blog.csdn.net/web718/article/details/4233767</fs:srclink><fs:srcfeed>http://blog.csdn.net/web718/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/web718/~1059433/641944639/1059433</fs:itemid></item></channel></rss>
