<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mingbo</title>
	<atom:link href="http://shao.mingbo.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://shao.mingbo.de</link>
	<description>包括教育技术，编程，互联网等方面的文章及随想。</description>
	<lastBuildDate>Fri, 26 Feb 2010 08:02:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>超文本转移协议与万维网高速缓存</title>
		<link>http://shao.mingbo.de/2010/02/26/proxy-server-with-web-cache-and-http/</link>
		<comments>http://shao.mingbo.de/2010/02/26/proxy-server-with-web-cache-and-http/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 07:50:04 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[教育技术学]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[web cache]]></category>
		<category><![CDATA[代理服务器]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=472</guid>
		<description><![CDATA[HTTP协议
HTTP是一个客户端和服务器端请求和应答的标准。从层次的角度看，HTTP是面向事务（所谓事务就是指一系列的信息交换，而这一系列交换是一个不可分割的整体，即要么所有的信息交换都完成，要么一次交换都不进行）的应用层协议，是万维网上能够可靠地交换文件的重要基础。
服务器进程不断的监听指定端口（默认端口为80），用来判断是否有浏览器（网络爬虫或其他客户进程）向它发出连接建立请求。当判断为真并建立连接之后，客户进程向源服务器（Origin Server）发出HTTP请求，源服务器响应，最后连接被释放。这样的操作交互遵循一定的规则与格式标准，而这个标准就是超文本转移协议HTTP。
HTTP虽然使用了TCP，但其本身是无状态的（stateless）。换句话说，同一个客户端第二次访问同一个服务器上的页面时，服务器的响应与第一次的相同。虽然TCP是面向连接的向上提供服务，但HTTP协议本身是无连接的。
尽管TCP/IP协议是互联网上最流行的应用，但HTTP协议并没有规定必须使用它和（基于）它支持的层。 事实上，HTTP可以在任何其他互联网协议上，或者在其他网络上实现。HTTP只假定（其下层协议提供）可靠的传输，任何能够提供这种保证的协议都可以被其使用。
HTTP报文
HTTP有两类报文，一种是请求报文，另一种是响应报文。它们都由三个部分组成。从下图不难看出，两种报文结构的开始行略有不同。



方法
空格
URL
空格
版本
CRLF


首部字段名：
空格
值
CRLF
 
 


…


首部字段名：
空格
值
CRLF
 
 


CRLF


实体主体（通常不用）



(a)  请求报文



版本
空格
状态码
空格
短语
CRLF


首部字段名：
空格
值
CRLF
 
 


…


首部字段名：
空格
值
CRLF
 
 


CRLF


实体主体（有些响应报文不用）



(b)  响应报文
1)    开始行，用于区分是请求报文还是响应报文。所有HTTP请求的第一行都是请求行，主要包含请求方法，请求资源的URL，以及HTTP的版本；而响应报文的开始行叫做状态行，主要包含HTTP的版本，状态码以及其对应的短语。它们都用空格隔开，CR代表回车，LF代表换行。
2)    首部（Head）行，用来描述浏览器（网络爬虫等）或服务器的一些信息。它可以有好几行，每一行都必须有CR与LF。整个首部行结束之后，还用一个CRLF将其与实体隔开。
3)    实体主体（Entity Body），请求报文中一般不用这个字段（只有请求方法要求时才会被放在请求消息中），而响应报文里也可以没有。
其中值得注意的是，状态代码的第一个数字代表当前响应的类型：

1xx 消息——请求已被服务器接收，继续处理
2xx 成功——请求已成功被服务器接收、理解、并接受
3xx 重定向——需要后续操作才能完成这一请求
4xx 请求错误——请求含有词法错误或者无法被执行
5xx 服务器错误——服务器在处理某个正确请求时发生错误

虽然 RFC 2616 中已经推荐了描述状态的短语，例如&#8221;200 OK&#8221;，&#8221;404 Not Found&#8221;，但是 WEB 开发者仍然能够自行决定采用何种短语，用以显示本地化的状态描述或者自定义信息。
可以看到的是，HTTP仍在不断的发展。现在的较新的版本是1999年公布的HTTP/1.1[RFC 2616]，它已成为因特网草案标准。而下一代HTTP(HTTP-NG)则正在研究之中。
万维网高速缓存
万维网高速缓存（Web cache）是代理服务器的一种功能，它将最近的一些请求与响应暂存在代理服务器的本地磁盘中。如果新的请求与代理服务器的缓存吻合，则直接从代理服务器返回响应；反之，则需要按照请求的URL再次通过Internet访问该资源。其大致过程如下：
1)    客户端（浏览器）需要发送请求时，与带有Web Cache功能的代理服务器建立TCP连接，并向代理服务器发送HTTP请求报文。
2)    如果代理服务器已经存放了所请求的对象，则直接将其放入HTTP响应报文中返回给客户端（浏览器）。
3)    否则，代理服务器就代表客户端（浏览器），与Internet上的源服务器建立TCP连接，并发送HTP请求报文，源服务器把请求对象放在HTTP响应报文中返回给代理服务器。
4)    代理服务器获得该对象之后，先复制保存到本地磁盘（为其日后服务），再将该对象放在HTTP响应报文中，通过之前与客户端建立的TCP返回给用户（浏览器）。
其中，保存到本地磁盘以及返回响应之前，我们Ipv6项目还有很多事要做。
]]></description>
			<content:encoded><![CDATA[<h1><strong>HTTP</strong><strong>协议</strong></h1>
<p>HTTP是一个客户端和服务器端请求和应答的标准。从层次的角度看，HTTP是面向事务（所谓事务就是指一系列的信息交换，而这一系列交换是一个不可分割的整体，即要么所有的信息交换都完成，要么一次交换都不进行）的应用层协议，是万维网上能够可靠地交换文件的重要基础。</p>
<p><strong>服务器进程</strong>不断的监听指定端口（默认端口为80），用来判断是否有浏览器（网络爬虫或其他<strong>客户进程</strong>）向它发出连接建立请求。当判断为真并建立连接之后，客户进程向源服务器（Origin Server）发出HTTP请求，源服务器响应，最后连接被释放。这样的操作交互遵循一定的规则与格式标准，而这个标准就是超文本转移协议HTTP。</p>
<p>HTTP虽然使用了TCP，但其本身是<strong>无状态的（stateless）</strong>。换句话说，同一个客户端第二次访问同一个服务器上的页面时，服务器的响应与第一次的相同。虽然TCP是面向连接的向上提供服务，但HTTP协议本身是<strong>无连接的</strong>。</p>
<p>尽管TCP/IP协议是互联网上最流行的应用，但HTTP协议并没有规定必须使用它和（基于）它支持的层。 事实上，HTTP可以在任何其他互联网协议上，或者在其他网络上实现。<strong>HTTP只假定（其下层协议提供）可靠的传输，任何能够提供这种保证的协议都可以被其使用</strong>。</p>
<h1><strong>HTTP</strong><strong>报文</strong></h1>
<p>HTTP有两类报文，一种是请求报文，另一种是响应报文。它们都由三个部分组成。从下图不难看出，两种报文结构的开始行略有不同。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">方法</td>
<td valign="top">空格</td>
<td valign="top">URL</td>
<td valign="top">空格</td>
<td valign="top">版本</td>
<td valign="top">CRLF</td>
</tr>
<tr>
<td valign="top">首部字段名：</td>
<td valign="top">空格</td>
<td valign="top">值</td>
<td valign="top">CRLF</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td colspan="6" valign="top">…</td>
</tr>
<tr>
<td valign="top">首部字段名：</td>
<td valign="top">空格</td>
<td valign="top">值</td>
<td valign="top">CRLF</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td colspan="6" valign="top">CRLF</td>
</tr>
<tr>
<td colspan="6" valign="top">实体主体（通常不用）</td>
</tr>
</tbody>
</table>
<p>(a)  请求报文</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">版本</td>
<td valign="top">空格</td>
<td valign="top">状态码</td>
<td valign="top">空格</td>
<td valign="top">短语</td>
<td valign="top">CRLF</td>
</tr>
<tr>
<td valign="top">首部字段名：</td>
<td valign="top">空格</td>
<td valign="top">值</td>
<td valign="top">CRLF</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td colspan="6" valign="top">…</td>
</tr>
<tr>
<td valign="top">首部字段名：</td>
<td valign="top">空格</td>
<td valign="top">值</td>
<td valign="top">CRLF</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td colspan="6" valign="top">CRLF</td>
</tr>
<tr>
<td colspan="6" valign="top">实体主体（有些响应报文不用）</td>
</tr>
</tbody>
</table>
<p>(b)  响应报文</p>
<p>1)    开始行，用于区分是请求报文还是响应报文。所有HTTP请求的第一行都是请求行，主要包含请求方法，请求资源的URL，以及HTTP的版本；而响应报文的开始行叫做状态行，主要包含HTTP的版本，状态码以及其对应的短语。它们都用空格隔开，CR代表回车，LF代表换行。</p>
<p>2)    首部（Head）行，用来描述浏览器（网络爬虫等）或服务器的一些信息。它可以有好几行，每一行都必须有CR与LF。整个首部行结束之后，还用一个CRLF将其与实体隔开。</p>
<p>3)    实体主体（Entity Body），请求报文中一般不用这个字段（只有请求方法要求时才会被放在请求消息中），而响应报文里也可以没有。</p>
<p>其中值得注意的是，状态代码的第一个数字代表当前响应的类型：</p>
<ul>
<li>1xx 消息——请求已被服务器接收，继续处理</li>
<li>2xx 成功——请求已成功被服务器接收、理解、并接受</li>
<li>3xx 重定向——需要后续操作才能完成这一请求</li>
<li>4xx 请求错误——请求含有词法错误或者无法被执行</li>
<li>5xx 服务器错误——服务器在处理某个正确请求时发生错误</li>
</ul>
<p>虽然 RFC 2616 中已经推荐了描述状态的短语，例如&#8221;200 OK&#8221;，&#8221;404 Not Found&#8221;，但是 WEB 开发者仍然能够自行决定采用何种短语，用以显示本地化的状态描述或者自定义信息。</p>
<p>可以看到的是，HTTP仍在不断的发展。现在的较新的版本是1999年公布的HTTP/1.1[RFC 2616]，它已成为因特网草案标准。而下一代HTTP(HTTP-NG)则<a title="HTTP-NG" href="http://www.w3.org/Protocols/HTTP-NG/http-ng-status.html" target="_blank">正在研究之中</a>。</p>
<h1><strong>万维网高速缓存</strong></h1>
<p>万维网高速缓存（Web cache）是<a title="代理服务器的功能" href="http://zh.wikipedia.org/zh-cn/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8#.E4.BB.A3.E7.90.86.E6.9C.8D.E5.8A.A1.E5.99.A8.E7.9A.84.E5.8A.9F.E8.83.BD" target="_blank">代理服务器的一种功能</a>，它将最近的一些请求与响应暂存在代理服务器的本地磁盘中。如果新的请求与代理服务器的缓存吻合，则直接从代理服务器返回响应；反之，则需要按照请求的URL再次通过Internet访问该资源。其大致过程如下：</p>
<p>1)    客户端（浏览器）需要发送请求时，与带有Web Cache功能的代理服务器建立TCP连接，并向代理服务器发送HTTP请求报文。</p>
<p>2)    如果代理服务器已经存放了所请求的对象，则直接将其放入HTTP响应报文中返回给客户端（浏览器）。</p>
<p>3)    否则，代理服务器就代表客户端（浏览器），与Internet上的源服务器建立TCP连接，并发送HTP请求报文，源服务器把请求对象放在HTTP响应报文中返回给代理服务器。</p>
<p>4)    代理服务器获得该对象之后，先复制保存到本地磁盘（为其日后服务），再将该对象放在HTTP响应报文中，通过之前与客户端建立的TCP返回给用户（浏览器）。</p>
<p>其中，保存到本地磁盘以及返回响应之前，<strong>我们Ipv6项目还有很多事要做</strong>。</p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2010/02/26/proxy-server-with-web-cache-and-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>和阿Shi拍片</title>
		<link>http://shao.mingbo.de/2010/02/23/spring-festival-at-2010-with-ashi/</link>
		<comments>http://shao.mingbo.de/2010/02/23/spring-festival-at-2010-with-ashi/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:42:31 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[碎碎念]]></category>
		<category><![CDATA[春节]]></category>
		<category><![CDATA[照片]]></category>
		<category><![CDATA[阿屎]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=442</guid>
		<description><![CDATA[寒假在惆怅的走亲访友中消耗殆尽，尽管很不情愿，但“该来的”新学期，却挡也挡不住。好在，开学前和阿屎约好了，要一起出去玩玩单反，让我这个久居室内的宅男，也有机会品吸阳光的味道。

拍摄地点：主要是解放公园和汉口江滩
使用器材：Canon EOS 400D + EF 24-70 2.8L + EF 70-200 4L IS
故事起因：由于头天夜里聊的很晚，睡得更晚，第二天又早早的被鞭炮吵醒，所以&#8230;
故事人物：我和阿屎
故事时间：2010春节
故事梗概：完全是练手，纯粹俩傻小子满街乱转悠


&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

呃，这一个就是阿屎了&#8230;
]]></description>
			<content:encoded><![CDATA[<p>寒假在惆怅的走亲访友中消耗殆尽，尽管很不情愿，但“该来的”新学期，却挡也挡不住。好在，开学前和阿屎约好了，要一起出去玩玩单反，让我这个久居室内的宅男，也有机会品吸阳光的味道。</p>
<ul>
<li>拍摄地点：主要是解放公园和汉口江滩</li>
<li>使用器材：Canon EOS 400D + EF 24-70 2.8L + EF 70-200 4L IS</li>
<li>故事起因：由于头天夜里聊的很晚，睡得更晚，第二天又早早的被鞭炮吵醒，所以&#8230;</li>
<li>故事人物：我和阿屎</li>
<li>故事时间：2010春节</li>
<li>故事梗概：完全是练手，纯粹俩傻小子满街乱转悠</li>
</ul>
<p style="text-align: center;"><a title="Flickr 上 邵明博 的 瞌睡的鹦鹉" href="http://www.flickr.com/photos/22714894@N05/4376112924/"><img class="aligncenter" src="http://farm3.static.flickr.com/2786/4376112924_1097da851e.jpg" alt="瞌睡的鹦鹉" width="500" height="333" title="和阿Shi拍片" /></a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p style="text-align: center;"><a title="Flickr 上 邵明博 的 偷拍娃娃妞" href="http://www.flickr.com/photos/22714894@N05/4376101658/"><img src="http://farm3.static.flickr.com/2780/4376101658_8d8000bc6a.jpg" alt="偷拍娃娃妞" width="500" height="333" title="和阿Shi拍片" /></a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p style="text-align: center;"><a title="Flickr 上 邵明博 的 偷拍娃娃妞" href="http://www.flickr.com/photos/22714894@N05/4376106474/"><img src="http://farm3.static.flickr.com/2800/4376106474_a6eaccc9f0.jpg" alt="偷拍娃娃妞" width="500" height="333" title="和阿Shi拍片" /></a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p style="text-align: center;"><a title="Flickr 上 邵明博 的 阿屎" href="http://www.flickr.com/photos/22714894@N05/4375377331/"><img src="http://farm5.static.flickr.com/4004/4375377331_8573e3be5e.jpg" alt="阿屎" width="500" height="333" title="和阿Shi拍片" /></a></p>
<p style="padding-left: 30px;"><strong>呃，这一个就是阿屎了&#8230;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2010/02/23/spring-festival-at-2010-with-ashi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>落幕</title>
		<link>http://shao.mingbo.de/2010/02/20/goodbye-mylove/</link>
		<comments>http://shao.mingbo.de/2010/02/20/goodbye-mylove/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 08:56:37 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[碎碎念]]></category>
		<category><![CDATA[感情]]></category>
		<category><![CDATA[落幕]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=428</guid>
		<description><![CDATA[落幕那一刻，多少会给人带来些许遗憾。
憋的太久——我从来不会，不敢，不主动的在大多数场合谈及自己的感情生活——那个酸酸的，甜甜的，斗志昂扬的，冰天雪地的，磕磕碰碰的，吵吵闹闹的，偷偷摸摸的，两个春夏秋冬。不算甜蜜但却刻骨铭心的瞬间，我总爱劝慰她说，把时间轴拉长来看。只是现在，真的是点滴便永恒，但却不再有更多的点点滴滴了。那一天，我故作理智的告诉她：“之所以借口多多，是因为爱的不够&#8230;”哪里晓得，如梦初醒的时候，才发现，生活中的每个细节都被她浸透！我努力的擦拭着痕迹，可每当不经意之间，悲情就爬满心头&#8230;才明白心能有多痛！才明白&#8230;!

痛到没有知觉。没有了知觉，我又开始恢复理智，直到理智再被知觉吞噬，如此循环。那些清晰可见的回忆，触手可及的哀愁，在痛与不痛之间低吟&#8230;
人，从出生那一刻起，就不在单纯。所以他们说：合适的时间，遇到合适的人，才能孕育合适的感情，才能书写至少不算坏的结局。其实，结婚与恋爱毫无关系，人们老以为恋爱成熟后便自然而然的结婚，却不知结婚只是一种生活方式，人人可以结婚，简单得很。爱情……完全是另外一回事。
我感激那些纯真的情谊，至少，这一辈子，我拥有过。落幕&#8230;
]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">落幕那一刻，多少会给人带来些许遗憾。</p>
<p>憋的太久——我从来不会，不敢，不主动的在大多数场合谈及自己的感情生活——那个酸酸的，甜甜的，斗志昂扬的，冰天雪地的，磕磕碰碰的，吵吵闹闹的，偷偷摸摸的，两个春夏秋冬。不算甜蜜但却刻骨铭心的瞬间，我总爱劝慰她说，把时间轴拉长来看。只是现在，真的是点滴便永恒，但却不再有更多的点点滴滴了。那一天，我故作理智的告诉她：“之所以借口多多，是因为爱的不够&#8230;”哪里晓得，如梦初醒的时候，才发现，生活中的每个细节都被她浸透！我努力的擦拭着痕迹，可每当不经意之间，悲情就爬满心头&#8230;才明白心能有多痛！才明白&#8230;!</p>
<p style="text-align: center;"><img class="aligncenter" title="落幕" src="http://shao.mingbo.de/wp-content/uploads/2010/02/she-is-my-love.jpg" alt="she is my love" width="430" height="430" /></p>
<p>痛到没有知觉。没有了知觉，我又开始恢复理智，直到理智再被知觉吞噬，如此循环。那些清晰可见的回忆，触手可及的哀愁，在痛与不痛之间低吟&#8230;</p>
<p><strong>人，从出生那一刻起，就不在单纯。所以他们说：合适的时间，遇到合适的人，才能孕育合适的感情，才能书写至少不算坏的结局。其实，结婚与恋爱毫无关系，人们老以为恋爱成熟后便自然而然的结婚，却不知结婚只是一种生活方式，人人可以结婚，简单得很。爱情……完全是另外一回事。</strong></p>
<p>我感激那些纯真的情谊，至少，这一辈子，我拥有过。落幕&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2010/02/20/goodbye-mylove/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp中BackgroundWorker的用法</title>
		<link>http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 01:17:27 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[BackgroundWorker]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[线程]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=412</guid>
		<description><![CDATA[线程同步中，还有一个比较流行的类&#60;BackgroundWorker&#62;.
BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作（如下载和数据库事务）在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面，而且面临与这类操作相关的长时间延迟，则可以使用 BackgroundWorker 类方便地解决问题。
若要在后台执行耗时的操作，请创建一个 BackgroundWorker，侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建BackgroundWorker，也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker，则它会出现在组件栏中，而且它的属性会显示在“属性”窗口中。
若要设置后台操作，请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作，请调用 RunWorkerAsync。若要收到进度更新通知，请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知，请对 RunWorkerCompleted 事件进行处理。
下面这个例子，主要从这几个方面来谈 cancellation support and report progress。

    public partial class Form1 : Form
    &#123;
&#160;
        public Form1&#40;&#41;
        &#123;
           [...]]]></description>
			<content:encoded><![CDATA[<p>线程同步中，还有一个比较流行的类&lt;<strong>BackgroundWorker</strong>&gt;.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;"><strong>BackgroundWorker</strong> 类允许您在单独的专用线程上运行操作。耗时的操作（如下载和数据库事务）在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面，而且面临与这类操作相关的长时间延迟，则可以使用 <strong>BackgroundWorker</strong> 类方便地解决问题。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">若要在后台执行耗时的操作，请创建一个 <strong>BackgroundWorker</strong>，侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建<strong>BackgroundWorker</strong>，也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 <strong>BackgroundWorker</strong>，则它会出现在组件栏中，而且它的属性会显示在“属性”窗口中。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">若要设置后台操作，请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作，请调用 RunWorkerAsync。若要收到进度更新通知，请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知，请对 RunWorkerCompleted 事件进行处理。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">下面这个例子，主要从这几个方面来谈 <strong>cancellation support</strong> and <strong>report progress</strong>。</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">partial</span> <span style="color: #FF0000;">class</span> Form1 <span style="color: #008000;">:</span> Form
    <span style="color: #000000;">&#123;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> Form1<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            InitializeComponent<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">WorkerSupportsCancellation</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">WorkerReportsProgress</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">DoWork</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> DoWorkEventHandler<span style="color: #000000;">&#40;</span>backgroundWorker1_DoWork<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">RunWorkerCompleted</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> RunWorkerCompletedEventHandler<span style="color: #000000;">&#40;</span>backgroundWorker1_RunWorkerCompleted<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">ProgressChanged</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">new</span> ProgressChangedEventHandler<span style="color: #000000;">&#40;</span>backgroundWorker1_ProgressChanged<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> button1_Click<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">textBox1</span>.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;&quot;</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">textBox2</span>.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                ab a <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ab<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">textBox1</span>.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span>, <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">textBox2</span>.<span style="color: #0000FF;">Text</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">RunWorkerAsync</span><span style="color: #000000;">&#40;</span>a<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> button2_Click<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">CancelAsync</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> backgroundWorker1_ProgressChanged<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, ProgressChangedEventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">progressBar1</span>.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> e.<span style="color: #0000FF;">ProgressPercentage</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> backgroundWorker1_RunWorkerCompleted<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, RunWorkerCompletedEventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Cancelled</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">textBox3</span>.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Result :Canclled!&quot;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">progressBar1</span>.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">100</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span> <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Error</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                MessageBox.<span style="color: #0000FF;">Show</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Error Details : &quot;</span> <span style="color: #008000;">+</span> <span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Error</span> <span style="color: #0600FF;">as</span> Exception<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>
                    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">textBox3</span>.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Result :&quot;</span> <span style="color: #008000;">+</span> e.<span style="color: #0000FF;">Result</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">progressBar1</span>.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">100</span><span style="color: #008000;">;</span>
             <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> backgroundWorker1_DoWork<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, DoWorkEventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">//do something here backgroundly.</span>
&nbsp;
                <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">progressBar1</span>.<span style="color: #0000FF;">Maximum</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    Thread.<span style="color: #0000FF;">Sleep</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">50</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">ReportProgress</span><span style="color: #000000;">&#40;</span>i<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">backgroundWorker1</span>.<span style="color: #0000FF;">CancellationPending</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        e.<span style="color: #0000FF;">Cancel</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
                        return<span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
&nbsp;
                <span style="color: #000000;">&#125;</span>
                ab a <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>ab<span style="color: #000000;">&#41;</span>e.<span style="color: #0000FF;">Argument</span><span style="color: #008000;">;</span>
                e.<span style="color: #0000FF;">Result</span> <span style="color: #008000;">=</span> a.<span style="color: #0000FF;">C</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> ab
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> _a<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> A
        <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> _a<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
            set <span style="color: #000000;">&#123;</span> _a <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> _b<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> B
        <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> _b<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
            set <span style="color: #000000;">&#123;</span> _b <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">public</span> ab<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> a,<span style="color: #FF0000;">int</span> b<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>._a <span style="color: #008000;">=</span> a<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>._b <span style="color: #008000;">=</span> b<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> C
        <span style="color: #000000;">&#123;</span>
            get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> _b <span style="color: #008000;">+</span> _a<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp中同步类的设计</title>
		<link>http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 01:42:31 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[线程]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=408</guid>
		<description><![CDATA[尽量的避免问题，我们最好不要在线程之间共享数据。如果要共享数据，就必须使用同步技术：确保一次只有一个线程访问和改变共享数据。其中不可避免的要用到“锁”。使用锁是需要时间的，并且，也不是总是必须的。所以对于一个类，我们可以创建一个类的2个版本，一个同步版本，一个异步版本。下面请看这个例子：

        public class SynDemo
        &#123;
            public virtual bool IsSynchronized
            &#123;
          [...]]]></description>
			<content:encoded><![CDATA[<p>尽量的避免问题，我们最好不要在线程之间共享数据。如果要共享数据，就必须使用同步技术：确保一次只有一个线程访问和改变共享数据。其中不可避免的要用到“锁”。使用锁是需要时间的，并且，也不是总是必须的。所以对于一个类，我们可以创建一个类的2个版本，一个同步版本，一个异步版本。下面请看这个例子：</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> SynDemo
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">virtual</span> <span style="color: #FF0000;">bool</span> IsSynchronized
            <span style="color: #000000;">&#123;</span>
                get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> false<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">virtual</span> <span style="color: #0600FF;">void</span> doThis<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">//dothis</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">virtual</span> <span style="color: #0600FF;">void</span> doThat<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">//doThat</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> SynDemo SynchronizeDemo<span style="color: #000000;">&#40;</span>SynDemo d<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>d.<span style="color: #0000FF;">IsSynchronized</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> SynchronizedDemo<span style="color: #000000;">&#40;</span>d<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">return</span> d<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
                    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">class</span> SynchronizedDemo <span style="color: #008000;">:</span> SynDemo
                    <span style="color: #000000;">&#123;</span>
                        <span style="color: #0600FF;">private</span> SynDemo _demo<span style="color: #008000;">;</span>
                        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">object</span> _synRoot <span style="color: #008000;">=</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                        <span style="color: #0600FF;">public</span> SynchronizedDemo<span style="color: #000000;">&#40;</span>SynDemo d<span style="color: #000000;">&#41;</span>
                        <span style="color: #000000;">&#123;</span>
                            <span style="color: #0600FF;">this</span>._demo <span style="color: #008000;">=</span> d<span style="color: #008000;">;</span>
                        <span style="color: #000000;">&#125;</span>
&nbsp;
                        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> IsSynchronized
                        <span style="color: #000000;">&#123;</span>
                            get
                            <span style="color: #000000;">&#123;</span>
                                <span style="color: #0600FF;">return</span> true<span style="color: #008000;">;</span>
                            <span style="color: #000000;">&#125;</span>
                        <span style="color: #000000;">&#125;</span>
&nbsp;
                        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> doThat<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
                        <span style="color: #000000;">&#123;</span>
                            <span style="color: #0600FF;">lock</span><span style="color: #000000;">&#40;</span>_synRoot<span style="color: #000000;">&#41;</span>
                            <span style="color: #000000;">&#123;</span>
                                _demo.<span style="color: #0000FF;">doThat</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                            <span style="color: #000000;">&#125;</span>
                        <span style="color: #000000;">&#125;</span>
&nbsp;
                        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> doThis<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
                        <span style="color: #000000;">&#123;</span>
                            <span style="color: #0600FF;">lock</span><span style="color: #000000;">&#40;</span>_synRoot<span style="color: #000000;">&#41;</span>
                            <span style="color: #000000;">&#123;</span>
                                _demo.<span style="color: #0000FF;">doThis</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                            <span style="color: #000000;">&#125;</span>
                        <span style="color: #000000;">&#125;</span>
&nbsp;
                    <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp中给线程传递参数</title>
		<link>http://shao.mingbo.de/2009/12/20/paralize-thread-in-charp/</link>
		<comments>http://shao.mingbo.de/2009/12/20/paralize-thread-in-charp/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 03:13:38 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[线程]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=405</guid>
		<description><![CDATA[在c#中如何给线程传递参数呢？其实很简单。一般来说可以采用2种方式：

使用带parameterizeThreadStart委托参数的Thread构造函数
定制一个类，通过该类的构造函数初始化想要传递的参数，再将该参数应用该类的方法。把线程的方法定义为该类实例的方法即可。

下面是一个Demo ：

        public static void Main&#40;&#41;
        &#123;
            //1.使用一个带参数的委托ParameterizedThreadStart来初始化Thread
            myData data = new myData&#40;&#41;;
       [...]]]></description>
			<content:encoded><![CDATA[<p>在c#中如何给线程传递参数呢？其实很简单。一般来说可以采用2种方式：</p>
<ul>
<li>使用带parameterizeThreadStart委托参数的Thread构造函数</li>
<li>定制一个类，通过该类的构造函数初始化想要传递的参数，再将该参数应用该类的方法。把线程的方法定义为该类实例的方法即可。</li>
</ul>
<p>下面是一个Demo ：</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">//1.使用一个带参数的委托ParameterizedThreadStart来初始化Thread</span>
            myData data <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> myData<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            data.<span style="color: #0000FF;">Message</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;new Info&quot;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span>paralizeThread<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span>data<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//2.通过初始化一个类的字段，将该类的方法封装到线程中去</span>
            <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> myThreadClass<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;new info2&quot;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ThreadMethod</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
        <span style="color: #008080; font-style: italic;">//类或结构都行</span>
        <span style="color: #FF0000;">struct</span> myData
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">string</span> message<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Message
            <span style="color: #000000;">&#123;</span>
                get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> message<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
                set <span style="color: #000000;">&#123;</span> message <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> paralizeThread<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> o<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            myData data <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>myData<span style="color: #000000;">&#41;</span>o<span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Thread {1} received a Parameter : {0}&quot;</span>,data.<span style="color: #0000FF;">Message</span>,Thread.<span style="color: #0000FF;">CurrentThread</span>.<span style="color: #0000FF;">ManagedThreadId</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #FF0000;">class</span> myThreadClass
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">string</span> _message<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">public</span> myThreadClass<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> message<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">this</span>._message <span style="color: #008000;">=</span> message<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> ThreadMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Thread {1} received a Parameter : {0}&quot;</span>, <span style="color: #0600FF;">this</span>._message, Thread.<span style="color: #0000FF;">CurrentThread</span>.<span style="color: #0000FF;">ManagedThreadId</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/20/paralize-thread-in-charp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp中异步委托的笔记</title>
		<link>http://shao.mingbo.de/2009/12/19/asynchronous-delegate-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/19/asynchronous-delegate-in-csharp/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 12:13:33 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[委托]]></category>
		<category><![CDATA[异步]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=392</guid>
		<description><![CDATA[异步委托，首先要搞明白，为什么要用到异步委托。
长时间以来，我个人在编写代码的时候，都认为程序应该是执行完一件事之后，然后再干接下来的。这用计算机术语来讲，叫同步执行（Synchronous Execution）。但事实上，这样的执行效果不一定人性化。举下面的一组对照：

你有3份快件需要传递给远程客户。如果这件事由你本人亲自完成，那么，接下来，你将要停下手中的工作，跑3段路程，分别将这3个快件递交给3个不同的客户。然后返回公司继续执行你手上剩下的工作。现实生活中，这样的事情或许永远不会发生，因为聪明的你会打一个电话叫来快递专员来为你解决快件问题。
刚入学那会，写了一个资源转换工具。那个时候还没意识到出现了这样的问题：当我执行转换的时候，UI 无法继续响应用户的操作，而只有当转换完毕之后才恢复正常。实际上，现在分析起来，就是主线程没空搭理你，它正忙，忙完之后才能执行你的更新的操作。这个处境和之前的那个跑3段路传递3个快件的境遇差不多。.net 为我们设计了这个异步委托来执行类似快递专员的工作。

搞懂异步委托，需要理解BeginInvoke() ,EndInvoke() ,IAsyncResult 以及AsyncCallback 委托:
异步委托提供以异步方式调用同步方法的能力。当同步调用一个委托时，“Invoke”方法直接对当前线程调用目标方法。如果编译器支持异步委托，则它将生成“Invoke”方法以及“BeginInvoke”和“EndInvoke”方法。如果调用“BeginInvoke”方法，则公共语言运行库 (CLR) 将对请求进行排队并立即返回到调用方。将对来自线程池的线程调用该目标方法。提交请求的原始线程自由地继续与目标方法并行执行，该目标方法是对线程池线程运行的。如果在对“BeginInvoke”方法的调用中指定了回调方法，则当目标方法返回时将调用该回调方法。在回调方法中，“EndInvoke” 方法获取返回值和所有输入/输出参数。如果在调用“BeginInvoke”时未指定任何回调方法，则可以从调用“BeginInvoke”的线程中调用“EndInvoke”。
下面，我用一个例子，谈谈可能发生的4种情况

    class Programe
    &#123;
        private delegate void ADelegateSomewhat&#40;int x&#41;;
&#160;
        public static void Main&#40;&#41;
        &#123;
     [...]]]></description>
			<content:encoded><![CDATA[<p>异步委托，首先要搞明白，为什么要用到异步委托。</p>
<p>长时间以来，我个人在编写代码的时候，都认为程序应该是执行完一件事之后，然后再干接下来的。这用计算机术语来讲，叫同步执行（Synchronous Execution）。但事实上，这样的执行效果不一定人性化。举下面的一组对照：</p>
<ul>
<li>你有3份快件需要传递给远程客户。如果这件事由你本人亲自完成，那么，接下来，你将要停下手中的工作，跑3段路程，分别将这3个快件递交给3个不同的客户。然后返回公司继续执行你手上剩下的工作。现实生活中，这样的事情或许永远不会发生，因为聪明的你会打一个电话叫来快递专员来为你解决快件问题。</li>
<li>刚入学那会，写了一个<a href="http://shao.mingbo.de/2009/10/10/ipv6-web-auto-adaptation/">资源转换工具</a>。那个时候还没意识到出现了这样的问题：当我执行转换的时候，UI 无法继续响应用户的操作，而只有当转换完毕之后才恢复正常。实际上，现在分析起来，就是主线程没空搭理你，它正忙，忙完之后才能执行你的更新的操作。这个处境和之前的那个跑3段路传递3个快件的境遇差不多。.net 为我们设计了这个<strong>异步委托</strong>来执行类似快递专员的工作。</li>
</ul>
<p>搞懂<strong>异步委托</strong>，需要理解<strong>BeginInvoke() </strong>,<strong>EndInvoke()</strong> ,<strong>IAsyncResult</strong> 以及<strong>AsyncCallback</strong> 委托:</p>
<blockquote><p>异步委托提供以异步方式调用同步方法的能力。当同步调用一个委托时，“Invoke”方法直接对当前线程调用目标方法。如果编译器支持异步委托，则它将生成“Invoke”方法以及“BeginInvoke”和“EndInvoke”方法。如果调用“BeginInvoke”方法，则公共语言运行库 (CLR) 将对请求进行排队并立即返回到调用方。将对来自线程池的线程调用该目标方法。提交请求的原始线程自由地继续与目标方法并行执行，该目标方法是对线程池线程运行的。如果在对“BeginInvoke”方法的调用中指定了回调方法，则当目标方法返回时将调用该回调方法。在回调方法中，“EndInvoke”<strong> </strong>方法获取返回值和所有输入/输出参数。如果在调用“BeginInvoke”时未指定任何回调方法，则可以从调用“BeginInvoke”的线程中调用“EndInvoke”。</p></blockquote>
<p>下面，我用一个例子，谈谈可能发生的4种情况</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">    <span style="color: #FF0000;">class</span> Programe
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">delegate</span> <span style="color: #0600FF;">void</span> ADelegateSomewhat<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            ADelegateSomewhat aD <span style="color: #008000;">=</span> MathPupil<span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">////1.直接调用EndInvoke,这和直接调用MathPupil(100)的效果一样，</span>
            <span style="color: #008080; font-style: italic;">////但会等到这个方法执行完之后才去执行后面的语句</span>
            <span style="color: #008080; font-style: italic;">//IAsyncResult ar= aD.BeginInvoke(100,null,null);</span>
            <span style="color: #008080; font-style: italic;">//aD.EndInvoke(ar);</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">////2.轮询,每隔50毫秒看看孩子算完了没.</span>
            <span style="color: #008080; font-style: italic;">//IAsyncResult ar = aD.BeginInvoke(200, null, null);</span>
            <span style="color: #008080; font-style: italic;">//while (!ar.IsCompleted)</span>
            <span style="color: #008080; font-style: italic;">//{</span>
            <span style="color: #008080; font-style: italic;">//    Console.Write(&quot;.&quot;);</span>
            <span style="color: #008080; font-style: italic;">//    Thread.Sleep(500);</span>
            <span style="color: #008080; font-style: italic;">//}</span>
            <span style="color: #008080; font-style: italic;">//aD.EndInvoke(ar);</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">////3.实际上和2的方法类似，只是把Sleep的时间放上来了</span>
            <span style="color: #008080; font-style: italic;">////但事实上，功能会多点,比如控制跳出的条件等</span>
            <span style="color: #008080; font-style: italic;">//IAsyncResult ar = aD.BeginInvoke(300,null,null);</span>
            <span style="color: #008080; font-style: italic;">//while (!ar.AsyncWaitHandle.WaitOne(500))</span>
            <span style="color: #008080; font-style: italic;">//{</span>
            <span style="color: #008080; font-style: italic;">//    Console.Write(&quot;.&quot;);</span>
            <span style="color: #008080; font-style: italic;">//}</span>
            <span style="color: #008080; font-style: italic;">//aD.EndInvoke(ar);</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//4.回调函数,最有意义,设置相对麻烦点</span>
            IAsyncResult ar <span style="color: #008000;">=</span> aD.<span style="color: #0000FF;">BeginInvoke</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">400</span>, MathCallBack, aD<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//现在干点别的事，不用关心算算术题的孩子了。</span>
            <span style="color: #008080; font-style: italic;">//由delegate的回调方法自动来管理</span>
            Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//如果不等待委托完成其任务就结束主线程，委托线程就会停止</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//假装自己一个小学生处理一道加法算术题，历时5秒钟</span>
        <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> MathPupil<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> x<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Now I'll pretend to be a pupil&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">int</span> sum <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> x<span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                sum <span style="color: #008000;">+=</span> i<span style="color: #008000;">;</span>
                Thread.<span style="color: #0000FF;">Sleep</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">5000</span><span style="color: #008000;">/</span>x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;After 5 secends, i've got the answer :&quot;</span> <span style="color: #008000;">+</span>sum<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> MathCallBack<span style="color: #000000;">&#40;</span>IAsyncResult ar<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            ADelegateSomewhat aD <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>ADelegateSomewhat<span style="color: #000000;">&#41;</span>ar.<span style="color: #0000FF;">AsyncState</span><span style="color: #008000;">;</span>
            aD.<span style="color: #0000FF;">EndInvoke</span><span style="color: #000000;">&#40;</span>ar<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>我想，到目前为止，应该收回<a href="http://shao.mingbo.de/2009/12/02/customize-event-in-csharp/">之前提到委托</a>“从来不是一个重点”的言论了。</p>
<p>参考资料：<a href="http://msdn.microsoft.com/en-us/magazine/cc164036.aspx" target="_blank">&lt;MSDN-magazine&gt;:Asynchronous Method Execution Using Delegates</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/19/asynchronous-delegate-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp动态调用和反射的一个绝佳例子</title>
		<link>http://shao.mingbo.de/2009/12/16/dynamic-loading-assemblies-and-reflection-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/16/dynamic-loading-assemblies-and-reflection-in-csharp/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 15:28:22 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[动态调用]]></category>
		<category><![CDATA[反射]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=377</guid>
		<description><![CDATA[之前看反射那一章，真把个人看郁闷了。不巧的是，看到很多业内人士的专业博客说，不会这个也搞了几年的项目开发。哎。顿时打消了学习这个知识的念头。不过，挺巧的是，今天又遇到了一个讲这个内容的章节，只不过内容更具体了。
这样一个动态调用的程序，貌似实现了一个编译器的功能。在Textbox里写上代码，能在程序下方看到编译结果。有趣的是，当代码出错的时候，能在程序中看到错误信息：


//核心代码
       public string ComplieAndRun&#40;string input,out bool hasError&#41;
        &#123;
            CompilerResults cResults = null;
            string returnData = null;
     [...]]]></description>
			<content:encoded><![CDATA[<p>之前看反射那一章，真把个人看郁闷了。不巧的是，看到很多业内人士的专业博客说，不会这个也搞了几年的项目开发。哎。顿时打消了学习这个知识的念头。不过，挺巧的是，今天又遇到了一个讲这个内容的章节，只不过内容更具体了。</p>
<p>这样一个动态调用的程序，貌似实现了一个编译器的功能。在Textbox里写上代码，能在程序下方看到编译结果。有趣的是，当代码出错的时候，能在程序中看到错误信息：</p>
<p style="text-align: center;"><a href="http://shao.mingbo.de/wp-content/uploads/2009/12/dynamic-loading-assemblies.jpg"><img class="aligncenter size-full wp-image-383" title="dynamic-loading-assemblies" src="http://shao.mingbo.de/wp-content/uploads/2009/12/dynamic-loading-assemblies.jpg" alt="dynamic loading assemblies cSharp动态调用和反射的一个绝佳例子" width="455" height="315" /></a></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//核心代码</span>
       <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> ComplieAndRun<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> input,<span style="color: #0600FF;">out</span> <span style="color: #FF0000;">bool</span> hasError<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            CompilerResults cResults <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
            <span style="color: #FF0000;">string</span> returnData <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
            hasError <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">using</span><span style="color: #000000;">&#40;</span>Microsoft.<span style="color: #0000FF;">CSharp</span>.<span style="color: #0000FF;">CSharpCodeProvider</span> provider <span style="color: #008000;">=</span><span style="color: #008000;">new</span> CSharpCodeProvider<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                StringBuilder sb <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                sb.<span style="color: #0000FF;">Append</span><span style="color: #000000;">&#40;</span>prefix<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                sb.<span style="color: #0000FF;">Append</span><span style="color: #000000;">&#40;</span>input<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                sb.<span style="color: #0000FF;">Append</span><span style="color: #000000;">&#40;</span>postfix<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                CompilerParameters option <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CompilerParameters<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                option.<span style="color: #0000FF;">GenerateInMemory</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
                cResults<span style="color: #008000;">=</span>provider.<span style="color: #0000FF;">CompileAssemblyFromSource</span><span style="color: #000000;">&#40;</span>option, sb.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>cResults.<span style="color: #0000FF;">Errors</span>.<span style="color: #0000FF;">HasErrors</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                hasError <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
                StringBuilder errMessage <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>CompilerError err <span style="color: #0600FF;">in</span> cResults.<span style="color: #0000FF;">Errors</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    errMessage.<span style="color: #0000FF;">AppendFormat</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{0}:{1}&quot;</span>, err.<span style="color: #0000FF;">Line</span>, err.<span style="color: #0000FF;">ErrorText</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
                returnData <span style="color: #008000;">=</span> errMessage.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">else</span>
            <span style="color: #000000;">&#123;</span>
                TextWriter temp<span style="color: #008000;">=</span>Console.<span style="color: #0000FF;">Out</span><span style="color: #008000;">;</span>
                StringWriter sw <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringWriter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                Console.<span style="color: #0000FF;">SetOut</span><span style="color: #000000;">&#40;</span>sw<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Type myType <span style="color: #008000;">=</span> cResults.<span style="color: #0000FF;">CompiledAssembly</span>.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;myDriver&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                myType.<span style="color: #0000FF;">InvokeMember</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Run&quot;</span>, BindingFlags.<span style="color: #0000FF;">InvokeMethod</span><span style="color: #008000;">|</span>BindingFlags.<span style="color: #0600FF;">Public</span> <span style="color: #008000;">|</span> BindingFlags.<span style="color: #0600FF;">Static</span>, <span style="color: #0600FF;">null</span>, <span style="color: #0600FF;">null</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Console.<span style="color: #0000FF;">SetOut</span><span style="color: #000000;">&#40;</span>temp<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                returnData <span style="color: #008000;">=</span> sw.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> returnData<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">//每次动态调用后，通过应用程序域卸载掉</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> DynamicRunAppInDomain
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> CompileAndRun<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> input,<span style="color: #0600FF;">out</span> <span style="color: #FF0000;">bool</span> hasErr<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            AppDomain app <span style="color: #008000;">=</span> AppDomain.<span style="color: #0000FF;">CreateDomain</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;DynamicRun&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            DynamicRun dr <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>DynamicRun<span style="color: #000000;">&#41;</span>app.<span style="color: #0000FF;">CreateInstanceAndUnwrap</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;ShaoMingboDrive&quot;</span>, <span style="color: #666666;">&quot;WpfApplication1.DynamicRun&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">string</span> res <span style="color: #008000;">=</span> dr.<span style="color: #0000FF;">ComplieAndRun</span><span style="color: #000000;">&#40;</span>input,<span style="color: #0600FF;">out</span> hasErr<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            AppDomain.<span style="color: #0000FF;">Unload</span><span style="color: #000000;">&#40;</span>app<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">return</span> res<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>这里是一个该程序的二进制文件：<a class="downloadlink" href="http://shao.mingbo.de/wp-content/plugins/download-monitor/download.php?id=4" title="Version1.0 downloaded 31 times" >动态调用demo (31)</a><strong>.net framework 3.5 required</strong><br />
如果您的机器上没有安装.net，不妨下载这个打包好的文件：<a class="downloadlink" href="http://shao.mingbo.de/wp-content/plugins/download-monitor/download.php?id=5" title=" downloaded 32 times" >动态调用Setup (32)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/16/dynamic-loading-assemblies-and-reflection-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp中异常处理的笔记</title>
		<link>http://shao.mingbo.de/2009/12/12/exception-handle-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/12/exception-handle-in-csharp/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 11:00:09 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[异常处理]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=359</guid>
		<description><![CDATA[停了几天的笔记。感觉学习的内容要么像反射（Reflection in .net framework）一样高深，想写点笔记却怎么也写不上；要么学习的内容（像集合、泛型，泛型集合、Language Integrated Querry）太细太杂，可写的太多，想记都记不过来。看到了.net 中的异常处理，总算，让我开始有点想法了。我总结了下面的几个问题：
1.执行多个catch 块，讲究一个顺序：从最特殊到最一般。下面的代码是我写的一个demo，模拟了3种异常：一种是用户的输入超过了规定值后，抛出了一个IndexOutOfRangeException，另一种是很普适的System.Exception，最后一种是不带参数的catch，它可以处理非托管堆上的代码异常（包括非c# 的代码）。以这样的顺序布局，才能够细致的捕获到各个可能出现的问题。但，如果将System.Exception 的catch 放到最前面，编译器就会报错：“上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常”，因为IndexOutOfRangeException是从System.Exception 里继承过来的。当然要体会这样布局的真正优势，需要一些彪悍的异常处理方法，而不是一个简单的Writeline().
错误 1 上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常 H:\vsProject\Lab\learningLab\learningLab\Programe.cs 28 20 learningLab

        public static void Main&#40;&#41;
        &#123;
            int aNum;
  [...]]]></description>
			<content:encoded><![CDATA[<p>停了几天的笔记。感觉学习的内容要么像反射（Reflection in .net framework）一样高深，想写点笔记却怎么也写不上；要么学习的内容（像集合、泛型，泛型集合、Language Integrated Querry）太细太杂，可写的太多，想记都记不过来。看到了.net 中的异常处理，总算，让我开始有点想法了。我总结了下面的几个问题：</p>
<p><strong>1.执行多个catch 块，讲究一个顺序：<span style="text-decoration: underline;"><span style="color: #ff0000;">从最特殊到最一般</span></span>。</strong>下面的代码是我写的一个demo，模拟了3种异常：一种是用户的输入超过了规定值后，抛出了一个IndexOutOfRangeException，另一种是很普适的System.Exception，最后一种是不带参数的catch，它可以处理非托管堆上的代码异常（包括非c# 的代码）。以这样的顺序布局，才能够细致的捕获到各个可能出现的问题。但，如果将System.Exception 的catch 放到最前面，编译器就会报错：“<span style="text-decoration: underline;">上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常</span>”，因为IndexOutOfRangeException是从System.Exception 里继承过来的。当然要体会这样布局的真正优势，需要一些彪悍的异常处理方法，而不是一个简单的Writeline().</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 28px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">错误 1 上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常 H:\vsProject\Lab\learningLab\learningLab\Programe.cs 28 20 learningLab</div>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">int</span> aNum<span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Input a number between 1 and 5:&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">string</span> userInput <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">try</span>
            <span style="color: #000000;">&#123;</span>
                aNum <span style="color: #008000;">=</span> Int32.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>userInput<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>aNum<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> aNum<span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">IndexOutOfRangeException</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;You type :&quot;</span> <span style="color: #008000;">+</span> userInput<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>IndexOutOfRangeException e<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Number should be between 1 and 5. But &quot;</span> <span style="color: #008000;">+</span> e.<span style="color: #0000FF;">Message</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>Exception e<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;An Exception in Managed Heap thrown by .net framework :&quot;</span> <span style="color: #008000;">+</span> e.<span style="color: #0000FF;">Message</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span>
            <span style="color: #000000;">&#123;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;An Exception in Unmanaged heap thrown by the .net framework!&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">finally</span> <span style="color: #000000;">&#123;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Thank you!&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>另外，这个代码在编译的时候会有一个警告：&#8221;上一个 catch 子句已捕获所有异常。引发的所有非异常均被包装在 System.Runtime.CompilerServices.RuntimeWrappedException 中。 &#8220;这个是因为本代码中根本就不包含非c# 的代码，出现的异常都在托管堆中发生。事实上这个代码的工作频率并不大，这里写上只是为了说明这个规则。</p>
<p><strong>2.修改异常类型。</strong>在上面的demo 中，如果用户没有输入一个数字而是字母或者是数字和字母的组合，那么将会看到：&#8221;<span style="text-decoration: underline;">An Exception in Managed Heap thrown by .net framework :输入字符串的格式不正确。</span>&#8220;我们知道错误是发生在Int32.Parse()这个方法里。但Exception 给出的提示信息不太符合咱们的思维，并且从安全的角度来说，它甚至有可能暴露程序的某些底层问题。因此修改异常类型迫在眉睫！</p>
<p><strong>3.设计异常中间类型</strong>。一段代码，可能异常处理集中在一堆里，但细节各不相同。为了使得整体的规律性，以及代码的便于管理，可以在这里给出一个继承于System.ApplicationException 的中间类，如MethodException。细致的处理异常，可以继续继承于MethodException，如OutOfRangeInMethodException,NotSupportMethodException等来处理各种不同的异常，这样就解决了第2点中提到的问题。</p>
<p><strong>4.嵌套的try-catch块</strong>。我想还是代码最能说明问题:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">            <span style="color: #0600FF;">try</span> <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//point A</span>
                <span style="color: #0600FF;">try</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//point B</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//point C</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">finally</span> <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//point D</span>
                <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//Error hanling</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">finally</span> <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//clean up</span>
            <span style="color: #000000;">&#125;</span></pre></div></div>

<p>这里没有处理什么问题，只是将2个嵌套的try-catch 块进行了一个大致的区域划分。</p>
<ul>
<li>当异常在point A、或者point D 中爆发，问题很简单，将由外层的catch 来捕获；</li>
<li>当异常在point A、或者point D 中爆发，而问题不太简单的时候，外层catch 无法捕获时，由.net framework 的隐藏try-catch 来捕获。</li>
<li>当异常在point B 中爆发，问题很简单，将由内层catch 来捕获；</li>
<li>当异常在point B 中爆发，而问题不太简单的时候，跳出内层try-catch 块，执行内层finally 块，问题变为在point A或者point D 爆发异常。</li>
<li>当异常在point C 中爆发，则会执行爆发C 异常之前的处理B的代码，而后退出内层try-catch 块，执行内层finally 块，问题变为在point A或者point D 爆发异常。</li>
</ul>
<p>多少个try-catch 都不是问题，这个例子只说明了嵌套try-catch 块的工作方式。开水房要关门了，我去打水先&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/12/exception-handle-in-csharp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>cSharp中委托和事件的学习笔记</title>
		<link>http://shao.mingbo.de/2009/12/02/customize-event-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/02/customize-event-in-csharp/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 10:03:33 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[事件]]></category>
		<category><![CDATA[委托]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=343</guid>
		<description><![CDATA[运算符重载那一章的内容，等整理完了再稍后奉上。首先，让我趁热打铁的把委托和事件的笔记写完。不得不说，看到这里，觉得《Professional C#2008》这本书写的够烂的了。一个排序比较的例子，从接口那一章用到了委托，实在有点牵强，虽然一个比较算法用委托来定义是有效的，但把一个比较的能力看做是一个对象所拥有的属性更为恰当。当然，作者这样安排书的内容，无疑让我们可以看到：接口和委托都是允许类设计器分离声明和实现的。那么什么时候该用委托，什么时候该用接口呢？下面给出微软的一些我觉得还不错的建议。
以下几种情况比较适合委托：

当使用事件设计模式时；
当封装静态方式调用时；
当需要一个方法的多个实现时；（多播委托）
当调用一个实例方法而它不需要使用该实例的其他属性，方法，字段时；（独立性）

以下情况比较适合接口：

当方法和类型的能力挂钩时；（如类的自我比较能力IComparable）
当有一组可能被调用的相关方法时；（它们可能参数类型各不相同）
当类只需要方法的单个实现时；

委托从来不是一个重点，但委托，总是和事件联系紧密，再提到事件之前，必须要对他进行一个小小的知识梳理和补充。
委托：

委托实现了类似于c++ 中的函数指针，它包含的只是方法的地址，它可以将方法作为参数进行传递，它很安全
委托在c#2.0中使用了委托推断（允许不用new了），实现了匿名方法，在c#3.0中加入了Lambda 表达式，利用它们可以更简练地编写内联代码块
多播委托，其签名必须返回为void，否则就只能得到最后一个方法的结果
多播委托中，一个方法抛出异常，整个迭代会被终止；使用GetInvocationList()，来进行手动迭代
协变是允许方法的返回类型为派生类；抗变是运行方法的参数类型为派生类

谈完了委托，现在该来说说我们关心的事件。

事件的发行者决定什么时候引发事件，而订户决定怎么来响应事件；
一个事件可以有多个订户，一个订户可以响应多个事件；
一个事件可以引发多个订户同时响应，事件可以同步线程（当然也可以异步调用）；
没有订户的事件永远不会发生

在编写代码的过程中，实现一个事件，会遇到下面的几个层次：

订阅和取消
实现符合.net Framework 标准的事件(EventHandler&#38; EventArgs)
实现继承关系中的事件设计
实现接口关系中的事件设计
在字典中实现事件的设计（暂未接触字典方面的知识）

下面，我想给出一个自己写的继承关系中的事件设计demo：

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
&#160;
namespace learningLab
&#123;
    class growUPEventArgs:EventArgs
    &#123;
        public string Message &#123;get;set;&#125;
        public growUPEventArgs&#40;string message&#41;
        &#123;
      [...]]]></description>
			<content:encoded><![CDATA[<p>运算符重载那一章的内容，等整理完了再稍后奉上。首先，让我趁热打铁的把<strong>委托和事件</strong>的笔记写完。不得不说，看到这里，觉得《Professional C#2008》这本书写的够烂的了。一个排序比较的例子，从接口那一章用到了委托，实在有点牵强，虽然一个比较算法用委托来定义是有效的，但把一个比较的能力看做是一个对象所拥有的属性更为恰当。当然，作者这样安排书的内容，无疑让我们可以看到：接口和委托都是允许类设计器分离声明和实现的。那么什么时候该用委托，什么时候该用接口呢？下面给出微软的一些我觉得还不错的建议。</p>
<p>以下几种情况比较适合<strong>委托</strong>：</p>
<ol>
<li>当使用事件设计模式时；</li>
<li>当封装静态方式调用时；</li>
<li>当需要一个方法的多个实现时；（多播委托）</li>
<li>当调用一个实例方法而它不需要使用该实例的其他属性，方法，字段时；（独立性）</li>
</ol>
<p>以下情况比较适合接口：</p>
<ol>
<li>当方法和类型的能力挂钩时；（如类的自我比较能力IComparable）</li>
<li>当有一组可能被调用的相关方法时；（它们可能参数类型各不相同）</li>
<li>当类只需要方法的单个实现时；</li>
</ol>
<p>委托从来不是一个重点，但委托，总是和事件联系紧密，再提到事件之前，必须要对他进行一个小小的知识梳理和补充。</p>
<p>委托：</p>
<ul>
<li>委托实现了类似于c++ 中的函数指针，它包含的只是方法的地址，它可以将方法作为参数进行传递，它很安全</li>
<li>委托在c#2.0中使用了委托推断（允许不用new了），实现了匿名方法，在c#3.0中加入了Lambda 表达式，利用它们可以更简练地编写内联代码块</li>
<li>多播委托，其签名必须返回为void，否则就只能得到最后一个方法的结果</li>
<li>多播委托中，一个方法抛出异常，整个迭代会被终止；使用GetInvocationList()，来进行手动迭代</li>
<li>协变是允许方法的返回类型为派生类；抗变是运行方法的参数类型为派生类</li>
</ul>
<p>谈完了委托，现在该来说说我们关心的事件。</p>
<ul>
<li>事件的发行者决定什么时候引发事件，而订户决定怎么来响应事件；</li>
<li>一个事件可以有多个订户，一个订户可以响应多个事件；</li>
<li>一个事件可以引发多个订户同时响应，事件可以同步线程（当然也可以异步调用）；</li>
<li>没有订户的事件永远不会发生</li>
</ul>
<p>在编写代码的过程中，实现一个事件，会遇到下面的几个层次：</p>
<ul>
<li>订阅和取消</li>
<li>实现符合.net Framework 标准的事件(EventHandler&amp; EventArgs)</li>
<li>实现继承关系中的事件设计</li>
<li>实现接口关系中的事件设计</li>
<li>在字典中实现事件的设计（暂未接触字典方面的知识）</li>
</ul>
<p>下面，我想给出一个自己写的继承关系中的事件设计demo：</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> learningLab
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">class</span> growUPEventArgs<span style="color: #008000;">:</span>EventArgs
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Message <span style="color: #000000;">&#123;</span>get<span style="color: #008000;">;</span>set<span style="color: #008000;">;</span><span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">public</span> growUPEventArgs<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> message<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Message</span><span style="color: #008000;">=</span>message<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    abstract <span style="color: #FF0000;">class</span> person
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> _name<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> _age<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name
        <span style="color: #000000;">&#123;</span>
            get
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> _name<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Age
        <span style="color: #000000;">&#123;</span>
            get
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">return</span> _age<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> person<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> name,<span style="color: #FF0000;">int</span> age<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>._age <span style="color: #008000;">=</span> age<span style="color: #008000;">;</span>
            <span style="color: #0600FF;">this</span>._name <span style="color: #008000;">=</span> name<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
&nbsp;
        <span style="color: #008080; font-style: italic;">//这里并没有使用委托而是使用了泛型的EventHandler，可以节约一行代码</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">event</span> EventHandler<span style="color: #008000;">&lt;</span>growUPEventArgs<span style="color: #008000;">&gt;</span> GrowUPEvent<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">virtual</span> <span style="color: #0600FF;">void</span> OnGrowUp<span style="color: #000000;">&#40;</span>growUPEventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">//handler是一个临时变量，防止被一个竞争占用</span>
            EventHandler<span style="color: #008000;">&lt;</span>growUPEventArgs<span style="color: #008000;">&gt;</span> handler <span style="color: #008000;">=</span> GrowUPEvent<span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//若handler不为空，则发行一个事件,this就是发行者person</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>handler <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                handler<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>, e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #008080; font-style: italic;">// 定义一个方法来触发事件</span>
       <span style="color: #0600FF;">public</span> abstract <span style="color: #0600FF;">void</span> growUp<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> student <span style="color: #008000;">:</span> person
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> student<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> name, <span style="color: #FF0000;">int</span> age<span style="color: #000000;">&#41;</span> <span style="color: #008000;">:</span> <span style="color: #0600FF;">base</span><span style="color: #000000;">&#40;</span>name, age<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
       <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnGrowUp<span style="color: #000000;">&#40;</span>growUPEventArgs e<span style="color: #000000;">&#41;</span>
       <span style="color: #000000;">&#123;</span>
           <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnGrowUp</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
       <span style="color: #000000;">&#125;</span>
&nbsp;
       <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> growUp<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
       <span style="color: #000000;">&#123;</span>
           <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">OnGrowUp</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> growUPEventArgs<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Yeah,I'm getting older!&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
           <span style="color: #008080; font-style: italic;">//throw new NotImplementedException();</span>
       <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> teacher <span style="color: #008000;">:</span> person
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> teacher<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> name, <span style="color: #FF0000;">int</span> age<span style="color: #000000;">&#41;</span> <span style="color: #008000;">:</span> <span style="color: #0600FF;">base</span><span style="color: #000000;">&#40;</span>name, age<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnGrowUp<span style="color: #000000;">&#40;</span>growUPEventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">OnGrowUp</span><span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> growUp<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">OnGrowUp</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> growUPEventArgs<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Oh,NO!I'm getting older!&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//throw new NotImplementedException();</span>
        <span style="color: #000000;">&#125;</span>      
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> InAclassRoom
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span>  List<span style="color: #008000;">&lt;</span>person<span style="color: #008000;">&gt;</span> _PersonList<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> InAclassRoom<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span> 
            _PersonList<span style="color: #008000;">=</span><span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span>person<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> addPeople<span style="color: #000000;">&#40;</span>person p<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            _PersonList.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>p<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            p.<span style="color: #0000FF;">GrowUPEvent</span> <span style="color: #008000;">+=</span> HandlerYourGrowUp<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> HandlerYourGrowUp<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> o,growUPEventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>e.<span style="color: #0000FF;">Message</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> List<span style="color: #008000;">&lt;</span>person<span style="color: #008000;">&gt;</span> getThePersonList<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> _PersonList<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span> 
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> Program
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            teacher t <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> teacher<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;MicroTeach&quot;</span>, <span style="color: #FF0000;">40</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            student s <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> student<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Shaomingbo&quot;</span>, <span style="color: #FF0000;">23</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            InAclassRoom classRoom <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> InAclassRoom<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            classRoom.<span style="color: #0000FF;">addPeople</span><span style="color: #000000;">&#40;</span>t<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            classRoom.<span style="color: #0000FF;">addPeople</span><span style="color: #000000;">&#40;</span>s<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//订阅了事件，但未触发。按回车后，方可触发;</span>
            <span style="color: #008080; font-style: italic;">//此处说明了，事件发行者决定事件&lt;何时发生&gt;</span>
            Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;You decide:&lt;Enter&gt;&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            List<span style="color: #008000;">&lt;</span>person<span style="color: #008000;">&gt;</span> plist <span style="color: #008000;">=</span> classRoom.<span style="color: #0000FF;">getThePersonList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>person p <span style="color: #0600FF;">in</span> plist<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Hi, My Name is &quot;</span> <span style="color: #008000;">+</span> p.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;,and i'm &quot;</span> <span style="color: #008000;">+</span> p.<span style="color: #0000FF;">Age</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; years old.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Actually ,i'm a &quot;</span> <span style="color: #008000;">+</span> p.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;When I feel getting older,i'd say :&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                p.<span style="color: #0000FF;">growUp</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>  
<span style="color: #000000;">&#125;</span>
<span style="color: #008080; font-style: italic;">/*Output:
You decide:&lt;Enter&gt;
&nbsp;
Hi, My Name is MicroTeach,and i'm 40 years old.
Actually ,i'm a learningLab.teacher
When I feel getting older,i'd say :
Oh,NO!I'm getting older!
&nbsp;
Hi, My Name is Shaomingbo,and i'm 23 years old.
Actually ,i'm a learningLab.student
When I feel getting older,i'd say :
Yeah,I'm getting older!
*/</span></pre></div></div>

<p>接口层次的设计，其实也应该来写写。但，由于还欠了好多笔记没整理暂时先停在这里。其中值得一提的是，一个类似于属性的事件访问器。其他的和继承实现没太多区别。</p>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/02/customize-event-in-csharp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
