﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-业精于勤荒于嬉,形成于思毁于随</title><link>http://www.cnblogs.com/fxwdl/</link><description>只吃馒头不吃菜，省下钱来谈俩恋爱！This is my simply life!</description><language>zh-cn</language><lastBuildDate>Mon, 08 Sep 2008 13:08:44 GMT</lastBuildDate><pubDate>Mon, 08 Sep 2008 13:08:44 GMT</pubDate><ttl>60</ttl><item><title>NUint问题两则</title><link>http://www.cnblogs.com/fxwdl/archive/2008/09/04/1284103.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Thu, 04 Sep 2008 08:02:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/09/04/1284103.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1284103.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/09/04/1284103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1284103.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1284103.html</trackback:ping><description><![CDATA[<ol>
    <li><font style="background-color: #55aa6a">在使用NUnit的过程中,通过调用Add Assembly菜单加载Dll文件的时候,发生错误:System.ApplicationException:Unable to load ...未能加载文件或程序集....这样的错误,发生这个错误的原因是当前进行测试的Dll文件所在的路径下缺少NUnit的Dll文件,将NUnit下的几个DLLCopy到测试的DLL路径下就可以了.</font></li>
    <li><font style="background-color: #55aa6a">关于配置文件.在DLL的项目中,增加的配置文件是App.config,它在编译的时候被放在Bin目录中,且被重命名为"Dll的名称.config".在使用以插件形式存在的附加软件,例如ReSharper,TestDriven时,测试是没有问题的,但是使用NUnit的在NUnit的GUI下新建了测试项目后导入测试的程序集,我发现NUnit的并没有加载配置文件.后来经过Google查找资料才得以解决,大概的原因是这样:NUnit支持两种测试方式:第一种是像我那样建测试项目,然后导入程序集;第二种是直接将程序集拖到NUint的GUI窗口中.而使用第二种方式时,对于配置文件是没有问题的,但是第一种方式就不行了,它要求配置文件必需和NUnit的测试项目在同一个文件夹内,且文件名相同,例如测试项目叫<font style="background-color: #55aa6a" face="Verdana">UnitTest.nunit</font>,那么应用程序的配置文件必需叫<font style="background-color: #55aa6a" face="Verdana">UnitTest.config</font>.那么这就会有一个浅在的问题,在需要修改配置文件时,就需要同时修改两个配置文件了.具体可以Google一下,我参照的文章地址是<a href="http://david.givoni.com/blog/?p=4">http://david.givoni.com/blog/?p=4</a></font></li>
</ol>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1284103.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42153/" target="_blank">[新闻]淘宝与微软总部达成首次合作 Silverlight加入店铺</a>]]></description></item><item><title>参数化查询比拼接字符串慢的原因</title><link>http://www.cnblogs.com/fxwdl/archive/2008/07/31/1257409.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Thu, 31 Jul 2008 08:38:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/07/31/1257409.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1257409.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/07/31/1257409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1257409.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1257409.html</trackback:ping><description><![CDATA[<p>我们都知道,参数化查询可以处理SQL注入,以及提高查询的效率,因为参数化查询会使MSSQL缓存查询的计划.</p>
<p>&nbsp;</p>
<p>但是现在我发现一个奇怪的问题,就是参数化查询比字符串拼接要慢,而且速度相关10倍之多.</p>
<p>&nbsp;</p>
<p>ADO.Net会将参数化查询转化为:</p>
<p><font style="background-color: #8aca8a" face="Verdana">exec sp_executesql N'<br />
SELECT&nbsp; ...</font><font style="background-color: #8aca8a" face="Verdana">&nbsp; Where (NotificationID = @NotificationID) ', N'@NotificationID nvarchar(10)', @NotificationID = N'NS03300947'</font></p>
<p><font style="background-color: #8aca8a">这种形式,而我的参数是通过:<font style="background-color: #8aca8a" face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exps.Add(Expression.EqualTo("NotificationID", OpenSession().CreateParameter(PARM_NOTIFICATIONID, pdDeliveryNotificationInfo.NotificationID,DbType.String, 10, ParameterDirection.Input)));这个语句创建的.</font></font></p>
<p><font style="background-color: #8aca8a"><font style="background-color: #8aca8a" face="Verdana"></font></font>&nbsp;</p>
<p><font style="background-color: #8aca8a"><font style="background-color: #8aca8a" face="Verdana">但是为什么会慢呢?经过查阅资料和自己的分析后,得知,原来是字符类型的不匹配造成的.因为这个数据表是客户数据库中的,我只是提取数据,而我一般建数据表都使用NVarchar类型,而客户的这个表使用的是Char(10),拼接字符串的时候,查询优化器会选择聚集索引查询,而使用参数化后,因为字段类型错误导致了表扫描..找到问题会就简单了,使用</font></font><font style="background-color: #8aca8a"><font style="background-color: #8aca8a" face="Verdana"></p>
<p><font style="background-color: #8aca8a" face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exps.Add(Expression.EqualTo("NotificationID", OpenSession().CreateParameter(PARM_NOTIFICATIONID, pdDeliveryNotificationInfo.NotificationID,DbType.AnsiStringFixedLength, 10, ParameterDirection.Input)));<br />
</font></p>
<p>创建参数就解决问题了.</p>
<p>&nbsp;</p>
<p>注:上面的语句是从我的项目中直接复制的,因为时间紧迫,为做记录而写此文,不过相信应该很多人都能明白了.<br />
</p>
</font></font>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1257409.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42151/" target="_blank">[新闻]苹果9日发布iTunes 8、iPhone 2.1和第四代iPod Nano</a>]]></description></item><item><title>[转]通用异步线程调用模式--通知线程</title><link>http://www.cnblogs.com/fxwdl/archive/2008/07/08/1237901.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Tue, 08 Jul 2008 01:02:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/07/08/1237901.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1237901.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/07/08/1237901.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1237901.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1237901.html</trackback:ping><description><![CDATA[<div class="postBody">
<p>目的：对于以交互式的用户界面而言，假如要调用长时间运行的操作，那么可以使用以下模式让你的调用更方便。</p>
<p>问题：某个用户界面必须多次启动某个操作，开发人员希望将其从该接口的操作中分开。这里面可能有很多的理由，但最普遍的情形是多个操作需要被立即执行，或某个操作潜在地占用过多的时间，超过了用户所期望的等待响应时间。某写操作的完成总是要占用时间，在等待某个操作护照或者多个操作在后台执行时，用户界面应该允许用户继续做其他事情。对于web上的操作，现在流行的AJAX热得一塌糊涂，通过异步调用来获取服务器端信息并更新客户端。对于winform来说，当然也可以进行异步调用了。本文试图提供一个稍微通用一点的解决方法。</p>
<p>适用性：<br />
在下列情况下可以使用：<br />
采用胖客户端，WinForm实现。<br />
操作被预期是长期的或者占用时间比较长的<br />
多个操作必须立即被处理执行的<br />
<br />
主要包括：<br />
&nbsp;&nbsp;&nbsp; public delegate void CompleteEvent&lt;T&gt;(T t);&nbsp;&nbsp; //采用泛型委托，操作的结果被传递给调用方。<br />
&nbsp;&nbsp;&nbsp; public delegate void ExceptionEvent(Exception ExceptionThrown);&nbsp;//异常将被传递给调用方<br />
&nbsp;&nbsp;&nbsp; public NotifyingThreadManager&lt;T&gt; //通知线程管理<br />
<br />
NotifyingThreadManager&lt;T&gt; 中<br />
&nbsp;public void ExecuteAsync(System.Windows.Forms.Control ControlToNotify, CompleteEvent&lt;T&gt; NotificationDelegate, ExceptionEvent ExceptionDelegate) 的目标就是存储需要用来通知的信息和启动封装线程的执行。我们需要知道将要同步的控件以及用来处理结果的两个委托。<br />
<br />
线程的主要工作在 protected void DoExecution()中完成，可以进行相应的修改以适应实际操作。<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Threading;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;com.tttick.NotifyingThreadManager<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_135_1562_Open_Image" onclick="this.style.display='none'; Codehighlighter1_135_1562_Open_Text.style.display='none'; Codehighlighter1_135_1562_Closed_Image.style.display='inline'; Codehighlighter1_135_1562_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_135_1562_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_135_1562_Closed_Text.style.display='none'; Codehighlighter1_135_1562_Open_Image.style.display='inline'; Codehighlighter1_135_1562_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_135_1562_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_135_1562_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">delegate</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CompleteEvent</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">(T&nbsp;t);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">delegate</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ExceptionEvent(Exception&nbsp;ExceptionThrown);<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;NotifyingThreadManager</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_300_1560_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_1560_Open_Text.style.display='none'; Codehighlighter1_300_1560_Closed_Image.style.display='inline'; Codehighlighter1_300_1560_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_300_1560_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_300_1560_Closed_Text.style.display='none'; Codehighlighter1_300_1560_Open_Image.style.display='inline'; Codehighlighter1_300_1560_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_300_1560_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_300_1560_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Windows.Forms.Control&nbsp;mControlToNotify;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompleteEvent</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;mFactoringComplete;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExceptionEvent&nbsp;mFactoringErrored;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;mExecution;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;t;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;NotifyingThreadManager(T&nbsp;t)<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img id="Codehighlighter1_535_569_Open_Image" onclick="this.style.display='none'; Codehighlighter1_535_569_Open_Text.style.display='none'; Codehighlighter1_535_569_Closed_Image.style.display='inline'; Codehighlighter1_535_569_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_535_569_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_535_569_Closed_Text.style.display='none'; Codehighlighter1_535_569_Open_Image.style.display='inline'; Codehighlighter1_535_569_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_535_569_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_535_569_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ExecuteAsync(System.Windows.Forms.Control&nbsp;ControlToNotify,&nbsp;CompleteEvent</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;NotificationDelegate,&nbsp;ExceptionEvent&nbsp;ExceptionDelegate)<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img id="Codehighlighter1_731_1045_Open_Image" onclick="this.style.display='none'; Codehighlighter1_731_1045_Open_Text.style.display='none'; Codehighlighter1_731_1045_Closed_Image.style.display='inline'; Codehighlighter1_731_1045_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_731_1045_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_731_1045_Closed_Text.style.display='none'; Codehighlighter1_731_1045_Open_Image.style.display='inline'; Codehighlighter1_731_1045_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_731_1045_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_731_1045_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mControlToNotify&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ControlToNotify;<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mFactoringComplete&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NotificationDelegate;<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mFactoringErrored&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ExceptionDelegate;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadStart&nbsp;startThread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ThreadStart(DoExecution);<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mExecution&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(startThread);<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mExecution.Start();<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DoExecution()<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img id="Codehighlighter1_1092_1553_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1092_1553_Open_Text.style.display='none'; Codehighlighter1_1092_1553_Closed_Image.style.display='inline'; Codehighlighter1_1092_1553_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1092_1553_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1092_1553_Closed_Text.style.display='none'; Codehighlighter1_1092_1553_Open_Image.style.display='inline'; Codehighlighter1_1092_1553_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1092_1553_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1092_1553_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">[]&nbsp;paramArray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img id="Codehighlighter1_1171_1369_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1171_1369_Open_Text.style.display='none'; Codehighlighter1_1171_1369_Closed_Image.style.display='inline'; Codehighlighter1_1171_1369_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1171_1369_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1171_1369_Closed_Text.style.display='none'; Codehighlighter1_1171_1369_Open_Image.style.display='inline'; Codehighlighter1_1171_1369_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1171_1369_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1171_1369_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">此处进行一个长时间的操作，请灵活使用</span><span style="color: #008000"><br />
</span><span style="color: #008080">35</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(</span><span style="color: #000000">10000</span><span style="color: #000000">);<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramArray[</span><span style="color: #000000">0</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">t;<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mControlToNotify.BeginInvoke(mFactoringComplete,paramArray);<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img id="Codehighlighter1_1416_1543_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1416_1543_Open_Text.style.display='none'; Codehighlighter1_1416_1543_Closed_Image.style.display='inline'; Codehighlighter1_1416_1543_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1416_1543_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1416_1543_Closed_Text.style.display='none'; Codehighlighter1_1416_1543_Open_Image.style.display='inline'; Codehighlighter1_1416_1543_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1416_1543_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1416_1543_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramArray[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ex;<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mControlToNotify.BeginInvoke(mFactoringErrored,&nbsp;paramArray);<br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">47</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
调用操作如下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;button1_Click(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_64_292_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_292_Open_Text.style.display='none'; Codehighlighter1_64_292_Closed_Image.style.display='inline'; Codehighlighter1_64_292_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_64_292_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_64_292_Closed_Text.style.display='none'; Codehighlighter1_64_292_Open_Image.style.display='inline'; Codehighlighter1_64_292_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_64_292_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_64_292_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NotifyingThreadManager</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NotifyingThreadManager</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">gadfg</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.ExecuteAsync(</span><span style="color: #0000ff">this</span><span style="color: #000000">.button1,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CompleteEvent</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">(FactoringComplete),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ExceptionEvent(FactoringErrored));<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;FactoringComplete(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Result)<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_340_390_Open_Image" onclick="this.style.display='none'; Codehighlighter1_340_390_Open_Text.style.display='none'; Codehighlighter1_340_390_Closed_Image.style.display='inline'; Codehighlighter1_340_390_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_340_390_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_340_390_Closed_Text.style.display='none'; Codehighlighter1_340_390_Open_Image.style.display='inline'; Codehighlighter1_340_390_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_340_390_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_340_390_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.button1.Text</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;Result;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;FactoringErrored(&nbsp;Exception&nbsp;ExceptionThrown)<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_458_525_Open_Image" onclick="this.style.display='none'; Codehighlighter1_458_525_Open_Text.style.display='none'; Codehighlighter1_458_525_Closed_Image.style.display='inline'; Codehighlighter1_458_525_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_458_525_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_458_525_Closed_Text.style.display='none'; Codehighlighter1_458_525_Open_Image.style.display='inline'; Codehighlighter1_458_525_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_458_525_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_458_525_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.button1.Text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ExceptionThrown.Message;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
通过异步调用线程，更改按钮的文字显示。<br />
对于构造函数的参数，还有线程的执行，只需要进行相应的修改即可满足要实际要求。<br />
<br />
PS:本文部分内容参考&lt;.NET模式&gt;一书 </div>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1237901.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42150/" target="_blank">[新闻]微软出品8GB蓝色和120GB Zune播放器</a>]]></description></item><item><title>NHibernate的第一个测试</title><link>http://www.cnblogs.com/fxwdl/archive/2008/07/07/1237361.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Mon, 07 Jul 2008 03:29:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/07/07/1237361.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1237361.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/07/07/1237361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1237361.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1237361.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px"><font style="background-color: #8aca8a">&nbsp;&nbsp;&nbsp;&nbsp; 最近一直在考虑软件开发的大致模型,包括各种技术的选用,以及到底以何种分层来组织代码,ORM可能是首先的一个要解决的问题,Hibernate是一个开源的优秀框架,我想还是从它开始吧.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 从园子里找了些文章,<font style="background-color: #8aca8a" face="Verdana"><a class="singleposttitle" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/bluesky521/archive/2008/03/16/1108627.html">NHibernate初学体验记</a> 从这个入门我想最好不过了吧,下载了NHibernate的最新源码,然后照着实践了一遍,发现有问题,加载配置文件时出错,错误很奇怪,有时候是实体类的配置文件出错,有的时候是app.config文件出错.试着将例子中的源码执行了一遍,没有问题....搞的我晕头转向,这是怎么回事呢?经过仔细的检查,我发现我建的项目引用的是最新版的<font style="background-color: #8aca8a" face="Verdana">NHibernate.dll</font>,版本是2.0.0.2001的Beta版,而例子引用的是1.2.0版本,那就有可能是两个版本对配置文件进行了修改,导致了这个问题.幸好,下载的NHibernate里面包含了一个Examples,里面有app.config文件,将其Copy到我的项目中,然后进行了一些小修改,运行.OK,通过.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 以此看过,这些版本的升级带来的问题的确是让人头疼的一件事.....<br />
</font><br />
</font></p>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1237361.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42144/" target="_blank">[新闻]千亿美元市值榜:微软居首移动第二 诺基亚退榜</a>]]></description></item><item><title>[转]三五个人十来条枪 如何走出软件作坊成为开发正规军</title><link>http://www.cnblogs.com/fxwdl/archive/2008/05/05/1182716.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Mon, 05 May 2008 01:00:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/05/05/1182716.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1182716.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/05/05/1182716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1182716.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1182716.html</trackback:ping><description><![CDATA[<div class="postText">从发了上一篇博文，这几天收到很多朋友的来信。
<p>大家从各个开发语言的优缺点和适用领域，一直讨论到设计模式、框架、重构、单元测试，乃至敏捷编程，最后都讨论到了软件开发过程管理，甚至都谈到了盈利模式和中国软件</p>
<p>的悲哀。</p>
<p>最后不了了之，都觉得改善中国内地现在的软件生产状况不可能。</p>
<p>为什么呢？</p>
<p>我重新把这几天大家的讨论留言翻了一遍，发现大家的软件团队都存在着这样一种普遍现象</p>
<p>1大部分人所在的公司，开发人员仅3-5人，多的在10人。别看就这几条枪，还从售前支持，软件开发，测试、打包发布、文档编写、实施安装、培训、技术支持都做。<br />
这还不算什么，而且几乎是一个人负责一个产品或一个项目，一个人从头跟到尾，而且负责多个客户的维护工作。<br />
这还不算什么，而且随时老板会找来八竿子打不着的新活，要的还挺紧，突然要开发，打乱了所有的计划，最后都懒的按计划行事，每天撞钟，老板有事就吩咐，没事就上网，还不让听歌，当然更不让打游戏。甚至还不让看技术书籍，呵斥不干工作。只能上网装作在工作。</p>
<p>2老板和员工互相斗智斗勇，在年终奖、报销、出差、平时福利上啊，都明争暗斗。老板卡的紧，员工就在项目和产品上下药，还不知道是谁占了谁便宜，谁给谁打了工。</p>
<p>3员工一边在刻苦钻研各种开发工具，阅读源代码，学习做DEMO例子，阅读UML、设计模式、单元测试、敏捷编程等等，一边却懒的修改现在公司的产品，有问题就打补丁，客户不嚷嚷就懒的修改，代码不优化，界面不友好，架构没架构，代码不封装</p>
<p>但是，在讨论中，我时时都强烈感觉到，大家是想把产品开发好，把开发过程管理的井井有条，但是都心有余而力不足。阅读了N多软件工程的书籍，从重型方法到轻型方法都阅读了，但都无法把现在的开发状态一点点扭转好。</p>
<p>许多人想闹革命，把现在这些产品和团队都砸塌，然后重新来过，但这只是梦想，说说而已。只能希冀下一次跳槽，能找到一个好的公司，把自己平生所学全部发挥出来，但这好像也只是梦想，因为交流了一下，大家彼此的境况基本相同。</p>
<p>一些极端主义者自己开了公司，才发现不持家不知道油盐贵，现在自己和手下变成了老板和员工的关系，走了过去的老路。</p>
<p>更有一些极端主义者辞职，自己做软件，最后由于生活拮据或做做发现这个软件没什么意义，就丢弃了自己的梦想，随便找一家公司开始沉默撞钟。</p>
<p>一些聪明的家伙，有的入了外企，有的进了大的网游公司，有的进了外包公司，有的进了大网站公司，都是讲究大规模开发的公司，希望能找到一条中国式团队开发产品保证之路</p>
<p><br />
作为小软件公司，我们真的无能为力了么？我们真的成为炮灰了么？</p>
<p>但是，中国软件行业大部分都是这样的公司。从每年的CSDN的程序员调查都可以看到，中国软件公司大部分都保持在这种开发团队规模，开发人员大部分都在毕业1-3年。</p>
<p>我们是在等待时间让人变得成熟么？我们是在等待时间让人变得技术综合实力增强么？</p>
<p>依笔者看，作为中国软件群体最大的小软件公司，需要的不是UML/RUP/CMM这些重型方法，不是前几年大家关注的小组开发方法，也不是敏捷编程这样的结对方法，我们都无法有这样的资源实现这样的方法。</p>
<p>但是，想想，星星之火可以燎原。红军能从爬雪山过草地起家，最后解放全中国。我们就没有方法？</p>
<p>那我们就需要想，就我们目前能拥有的权力和资源，我们如何一点点改进。我们需要的是从游击队到兄弟连，从兄弟连到正规军的方法。我们现在还处于游击队，一个队长领了一帮游兵散勇，有的人甚至没有枪还背着大刀，有的人还没杀过鬼子。</p>
<p>首先，要把我们自己变成兄弟连。</p>
<p>我常常观看国际著名的CS战队的比赛录像，他们配合的多好啊。如果他们都单兵作战，那么早就死翘翘了。这和咱们的软件开发多么相像。我们多么神往这种默契的配合，打的多么流畅。我们要的就是这个。他们也不几个人么。</p>
<p>那让我们来分析分析吧。</p>
<p>我们想好好专职的开发软件，但我们的时间都被实施安装、培训、技术支持占去了。为什么我们要做这些？是因为我们软件没有操作说明，其他部门人都不会用。而且我们也没有培训机制，其他部门人更不会用。而且我们的软件不稳定，其他部门人都拒绝实施。由于我们软件不稳定，老出问题，出了问题其他部门人也帮不上忙，只能我们自己去做技术支持。</p>
<p>从以上来看，主要矛盾就是在：操作说明、培训机制、稳定性。如何保证这三点。而且从以上来分析，稳定性是最重要的。不稳定，你即使有操作说明和培训机制，其他部门人都躲着实施，谁想去客户那里尴尬丢脸挨骂呀。所以，其他部门人会找各种理由向老板告开发部的状，以躲避实施，说软件太烂，根本无法拿出去。这也就是开发部往往和其他部门关系都不好，开发人员老抱怨自己就闷头辛苦开发解决问题，没有人说好，却被奸人陷害。天长日久，积怨颇深。其实说起来，根源还在开发部自己这里。</p>
<p>如何保证稳定性？</p>
<p>大家第一想到的就是招测试人员。当然，一些公司的老板是拒绝养测试人员的。另外，如果你只想到招测试人员，其他方法不配合测试人员，即使有了测试人员，软件稳定性仍然不会有提高。所以，有一些工作，是不管有没有测试人员，都必须是我们开发人员要做的：</p>
<p>每个人的技术水平都参次不齐的，每个人对自己代码的负责认真性也都是不一样的，所以要想提高稳定性，必须专门从队伍中找一个人，他作为公共代码开发员。每个产品或项目的修改需求，必须首先经过他的思考，能做成公共代码，能封装成函数，就他来做。其他的程序员只管调用函数，实现客户UI操作和辅助功能。这个公共代码开发员必须具备以下能力：<br />
A参与过几个主要项目的开发、实施、支持。这样，他对客户需求有综合的把握。如果队伍中没有这样的人，只有开发经理一个人有这样的经理，那么接到客户需求，分析客户需求，分解析辨是公共代码员来做还是其他开发人员来做。<br />
B公共代码开发员具有负责认真的工作态度，代码细心严谨考虑周详异常保护做的到位内存创建释放有头有尾，代码优美，代码可阅读，代码重构，代码性能和稳定都高<br />
C公共代码开发人员的技术能力高，知道封装成什么样的函数接口，在灵活性，以后的修改变化性上最好</p>
<p>应该说，找一个技术能力好的，工作认真负责的人，应该是不难找到的。而且专门做这件事，不让他参与各种杂事，他是应该能干好这件事的，而且会越做越好，这就是术有专攻。</p>
<p>刚才还讲到一件事，那就是开发经理要熟悉客户需求，而且是深刻理解客户需求。</p>
<p>客户需求，客户需求。这个让开发部最头疼的字眼。每当想起客户需求，就想起了以下这些话：<br />
1 程序员说：这是你们家个性的需求，太邪门，我们不做。客户说：不做我们找你们老板去，我们是花钱买了你们的产品的。<br />
2 客户说：我不会用鼠标，你给我做一个语音输入吧。我们还想要一个类似QQ的东西供我们内部沟通，你们给我们做一个吧。程序员：我晕。<br />
3 程序员说：等你们内部斗争完，你们协调完了，我再调研需求。</p>
<p>似乎，我们在需求上无能为力，我们永远在追赶客户的需求，满足他们的现状，把N多家的客户需求都加进软件中，只要能实现的，我们尽量咬牙实现了。</p>
<p>最后，我们发现，我们的软件无比复杂，谁也不会用了，连开发部门都不会用了，谁也不知道这个需求当时为什么是这样的。因为无比复杂，所以实施、培训、技术支持都成了问题，稳定性更成了问题。代码互相交叉，根本无法理清有多少交叉影响点。维护的程序员都快崩溃了，天天在祈求，千万别接到客户电话，千万别接到客户电话。</p>
<p>这个问题终归是问题，而且是软件开发最大的问题。虽然我们也动用了这样的技巧：<br />
1 客户业务部门不能随便提需求。必须集中汇总到客户IT部门，由客户IT部门汇总过滤完，再集中报给软件公司<br />
2 客户IT部门的需求，必须客户方负责IT项目的老板签字才能生效，才能报给软件公司<br />
3 不能随时报，每3个月集中报一次<br />
4 不能口头报（即使在现场实施支持也不行），不能电话报，只能MAIL或传真来报<br />
5 必须按我们规定的格式报，要严格写清楚需要实现的功能的界面，输入数据或输出数据，输入输出数据的格式要求，谁操作，多长时间操作一次。<br />
6 软件上线后只能免费修改3次。以后再有需求，就必须另签合同另收费，否则不予修改。</p>
<p>经过这么几招，客户也疲了。需求是不提了，开发部欢呼雀跃。但我们真的做好了么？难道客户真的满意了么？客户为什么要用我们的软件？难道仅仅是为了把他们现在手工做的，然后转到计算机去做。让计算机的查询统计计算速度代替人工？</p>
<p>客户为什么要提这样的需求？客户要根本解决什么问题？这些问题谁来想，谁来想解决办法？</p>
<p>OH，My God!我们无能为力，因为我们是技术人员，我们不懂业务。</p>
<p>那这个问题谁来解决？</p>
<p>程序员苦笑了：没有人解决，也没有人能解决。客户就要，你不做他就要给老板打电话。</p>
<p>噢，那就让程序员的噩梦继续吧。谁也救不了你，能救你的只有你自己。</p>
<p>要救我们自己，必须我们自己走出我们自己。谁让我们就处在这样的处境呢？我们都想过的好，只能我们自己救我们自己。</p>
<p>那我们就鼓足勇气，走出来，从我们的设计模式、OO、软件工程、虚拟接口、反射、持久化、框架中走出来。开发经理来承担起客户行业研究来：<br />
1 客户行业这个群体有多大？大中小规模各有多少家，各分布在什么省？我们面对的最佳客户是什么规模什么信息化程度的？我们的次佳客户是什么规模什么信息化程度的？<br />
2 我们的上层竞争对手、本层的竞争对手、下层竞争对手目前的产品怎么样？他们各自的优点是什么？他们各自的缺点是什么？我们应该突出的优点是什么？我们的缺点是什么？<br />
3 客户行业的过去5年，现在2年，未来3年的发展历史和趋势是什么？他们面临哪些挑战和机遇？<br />
4 我们现在所做的典型客户，他们的组织结构，人员规模，每个岗位每日业务流程、每个岗位每日每周每月每季每年的异常处理业务流程，每个岗位每日每周每月季每年的输入表格，每个岗位每日每周每月季每年的常用数据查询，每个岗位每日每周每月季每年的统计报表<br />
5 针对以上的了解，客户面对未来挑战和机遇，未来应该如何变更他们的岗位和职责和流程，尽量流程少，效率高，运转快？</p>
<p>其实，开发经理就相当于业务架构师（因为我们还是游击队，不可能有专职的业务架构师），公共代码开发员就相当于技术架构师。</p>
<p>柳传志说的非常好：搭班子，定战略，带队伍。你班子不行，上什么需求管理软件、版本管理软件、项目进度管理软件、自动测试、自动集成软件，都是无法落地执行的。</p>
<p>有了夯实的业务+技术，功能实用、功能符合客户操作、功能稳定。这是软件最基本的要求，就都能满足了。这时候再招测试人员，就能把质量再夯实了。</p>
<p>而且，测试人员由于熟知产品，他们还能做技术支持呢，这样可以有更多的开发人员来专职开发，开发的专业性就能越来越提高了。</p>
<p>好的产品，还需要有好的文档和培训，否则其他部门还是不会接开发部的产品的。</p>
<p>那就招一个文案人员，写帮助说明，制作操作视频，制作学习版数据库，参与辅助测试（这个很重要，否则文案人员不熟知产品，无法写出有质量的文案）。有了这些文案的基础，最熟悉产品的非开发人员就有了两个岗位：测试兼技术支持，那么文案就兼起培训工作（由于他自己写文案自己用自己的文案做培训，在培训中会有各种提问，会更加增进他对文案和产品的理解，能写出更好的文案。而且他不是开发人员，他能站在使用者的角度上来写来讲，而且他属于开发部门，他会给产品开发带来更多更好的产品易用性建议）。</p>
<p>好了，开发部的四套马车终于起来了，这就是我要讲的开发模式：从游击队转变为兄弟连，从软件作坊走向</p>
<p>记住：业务架构、技术架构、测试兼技术支持、文案兼培训，四套马车。</p>
<p>我们一直用它，效果很好，搭建团队容易，循序渐进不革命。</p>
<p>有了这么好的团队，就能比过去产出更好的软件，软件的质量，软件的进度，软件的竞争力就都上来了，再上各种管理软件：如项目管理软件、版本管理软件、BUG管理软件、自动测试软件，就水到渠成了。</p>
<p>其他部门也愿意接软件了，软件的实施和培训和技术支持都被其他部门接过去了。开发部门也终于专职专业起来了，整个公司都很协调了，部门间也不互相陷害抱怨了。公司发展速度蹭蹭的。</p>
<p>老板看着形式这么好，也不抠门了。奖金福利随之而来。老板看着公司产品销售这么好，也不用再为公司生存发愁了，不用随处找单子养活了，给开发部门更带来了专业理顺的计</p>
<p>划发展。老板也开始重视研发部门了，研发部门在公司的地位高多了，给与研发部门的资源和支持也更多了。</p>
<p>OH，My God!<br />
</p>
<div id="MySignature">冠亿科技,尽心尽力 </div>
</div>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1182716.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42142/" target="_blank">[新闻]Google申请“海上数据中心”专利 可能付诸行动</a>]]></description></item><item><title>从程序员到销售-转行经验谈[转]</title><link>http://www.cnblogs.com/fxwdl/archive/2008/04/12/1150465.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Sat, 12 Apr 2008 08:52:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/04/12/1150465.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1150465.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/04/12/1150465.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1150465.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1150465.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/WinYoung/archive/2008/03/24/zhiyeguihua.html"><font style="background-color: #8aca8a" face="Verdana">http://www.cnblogs.com/WinYoung/archive/2008/03/24/zhiyeguihua.html</font><br />
原来我也是喜欢篮球的</a> </div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">元旦以来就没有再做程序员的工作，而是改行做起了软件销售，就卖自己曾经开发的软件。发现自己的时间陡然增加了许多，竟然可以一场不少的看</span>NBA<span style="font-family: 宋体">了，这在做程序员的四年里面是想都不敢想的，或许可以偶尔去看，但不可能看这么多哦。</span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">回头过来想象，觉得程序员是个可敬同样也很可悲的职业，至少我觉得在国内是这样。可敬的是，程序员可以为了解决某个技术难题，或者为了紧张的项目进度，常常废寝忘食，没日没夜的加班。技术水平与日俱增。很快到达一个高度，成为圈子中的高手，公司中不可缺少的万金油。可悲的是，随着无休止的加班，自己的生活全没了，程序就是生活的全部，每天除了吃饭睡觉就是写程序。很少有自己的生活，看看依然奋斗在第一线的同志们就知道了，好多连交女朋友的时间都没有。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">每个人都需要好好规划自己的人生规划自己的职业，特别是程序员。如果不做规划，过些年年龄大了，有家有口的时候，再想加班去解决技术问题已经是很困难了。家庭不允许，生活不允许，身体也不允许。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">那么程序员该如何规划自己的职业生涯呢？</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">前段时间，博客园里面大家都在写自己</span>2008<span style="font-family: 宋体">年的愿景与规划，可是又有多少人做到了自己长久的规划呢？前面我没有去写，因为那个时候转型过渡期，软件研发部门的事情需要去做，销售部门的事情需要去学习，忙的不可开交，现在终于空闲了，可以多和园子里面的朋友交流一下了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">其实我一直都很喜欢</span>.NET<span style="font-family: 宋体">程序，也一直都在这个圈子里面摸爬滚打，不做程序员了，不妨碍我仍然是个不错的程序员和项目经理。在客户谈项目的时候我不用向其他销售一样需要有售前工程师做支持，只要不开发我都可以和客户去沟通。技术方案也可以自己写，也可以详细规划好了之后交给售前咨询去写。自己的时间充裕了之后，也常常学习跟踪微软新的平台，还常常给软件研发部门做公司内训，交流自己曾经的心得体会。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">至少我已经给自己做了规划，并且付诸行动，做了一名软件销售，你呢？</span></p>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1150465.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42141/" target="_blank">[新闻]用Google Earth实时追踪人造卫星</a>]]></description></item><item><title>关于"gdi+ 发生一般性错误"的处理.</title><link>http://www.cnblogs.com/fxwdl/archive/2008/03/28/1126919.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Fri, 28 Mar 2008 01:10:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/03/28/1126919.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1126919.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/03/28/1126919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1126919.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1126919.html</trackback:ping><description><![CDATA[做一个将图片存入数据库的程序,写了一个将图片转为字节数组的函数,如下:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;GetImageArray(System.Drawing.Image&nbsp;image)<br />
<img id="Codehighlighter1_79_276_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_79_276_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_79_276_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_79_276_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_79_276_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_79_276_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_79_276_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_79_276_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_79_276_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_79_276_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.IO.MemoryStream&nbsp;ms&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image.Save(ms,&nbsp;Image.RawFormat);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;b</span><span style="color: #000000">=</span><span style="color: #000000">ms.ToArray();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Close();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
在调用的时候,image参数来源于一个PictureBox中引用的Image对象.开始的时候以为这么简单的事情应该没什么,但是发现如果图片是从一个数据库中加载的,然后显示到PictureBox的时候,将这个PictureBox中引用的Image传送到这个方法中,将会发生"<font face="Verdana">gdi+ 发生一般性错误</font>",在网上搜索了一下找到一篇文章:<br />
<div class="codeArea cpp">
<div style="color: rgb(0,0,0)">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">我遇到的情况：<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在编写Chem.NET的时候要保存图片，我先用openFileDialog打开图片文件，然后用saveFileDialog保存文件时就出现了&nbsp;&#8220;GDI</span><span style="color: #000000">+</span><span style="color: #000000">中发生一般性错误&#8221;，我当时就想到是打开的文件还没有释放出来，于是用openFileDialog1.Dispose()来释放，可是没有成功。同样从一个MemorySream&nbsp;实例打开一个Image后，立即关闭了这个流，结果在Image.Save时也会发生这种错误。我&#8220;摆渡&#8221;了很久都是遇到和我一样问题的人，CSDN上面的同志也没有给出一个实用的答案。最后终于还是在微软的网站上找到了答案：（以下是官方解决办法）<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />症状<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />Bitmap&nbsp;对象或一个&nbsp;图像&nbsp;对象从一个文件,&nbsp;构造时该文件仍保留锁定对于对象的生存期。&nbsp;因此,&nbsp;无法更改图像并将其保存回它产生相同的文件。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />替代方法<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&#8226;&nbsp;&nbsp;&nbsp;&nbsp;创建非索引映像。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&#8226;&nbsp;&nbsp;&nbsp;&nbsp;创建索引映像。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />这两种情况下,&nbsp;原始&nbsp;位图&nbsp;上调用&nbsp;Bitmap.Dispose()&nbsp;方法删除该文件上锁或删除要求，&nbsp;流或内存保持活动。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />创建非索引图像<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />即使原始映像被索引格式中该方法要求新图像位于每像素&nbsp;(超过&nbsp;</span><span style="color: #800080">8</span><span style="color: #000000">&nbsp;位&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">,&nbsp;非索引像素格式。&nbsp;此变通方法使用&nbsp;Graphics.DrawImage()&nbsp;方法来将映像复制到新&nbsp;位图&nbsp;对象：<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">1</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;构造从流、&nbsp;从内存,&nbsp;或从文件原始&nbsp;位图&nbsp;。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">2</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;创建新&nbsp;位图&nbsp;的相同大小,&nbsp;带有是超过&nbsp;</span><span style="color: #800080">8</span><span style="color: #000000">&nbsp;位&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;像素&nbsp;(BPP)&nbsp;每像素格式。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">3</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;Graphics.FromImage()&nbsp;方法以获取有关二&nbsp;位图&nbsp;Graphics&nbsp;对象。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">4</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;用于&nbsp;Graphics.DrawImage()&nbsp;绘制首&nbsp;位图&nbsp;到二&nbsp;位图&nbsp;。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">5</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;用于&nbsp;Graphics.Dispose()&nbsp;处置是&nbsp;图形&nbsp;。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">6</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;用于&nbsp;Bitmap.Dispose()&nbsp;是首&nbsp;位图&nbsp;处置。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />创建索引映像<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />此解决办法在索引格式创建一个&nbsp;Bitmap&nbsp;对象：<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">1</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;构造从流、&nbsp;从内存,&nbsp;或从文件原始&nbsp;位图&nbsp;。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">2</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;创建新&nbsp;位图&nbsp;具有相同的大小和像素格式作为首&nbsp;位图&nbsp;。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">3</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;Bitmap.LockBits()&nbsp;方法来锁定整个图像对于两&nbsp;Bitmap&nbsp;对象以其本机像素格式。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">4</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;Marshal.Copy&nbsp;函数或其他内存复制函数来从首&nbsp;位图&nbsp;复制到二&nbsp;位图&nbsp;图像位。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">5</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;Bitmap.UnlockBits()&nbsp;方法可以解锁两&nbsp;Bitmap&nbsp;对象。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #800080">6</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;用于&nbsp;Bitmap.Dispose()&nbsp;是首&nbsp;位图&nbsp;处置。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />由于外国人的思维和我们不一样，我重新用实例解释一下，我这里使用的是创建非索引图像。<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ToolStripMenuItem_Click(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
<img id="Codehighlighter1_1231_1946_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1231_1946_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1231_1946_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1231_1946_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1231_1946_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1231_1946_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1231_1946_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1231_1946_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1231_1946_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1231_1946_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(openFileDialog1.ShowDialog()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;DialogResult.OK)<br />
<img id="Codehighlighter1_1310_1945_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1310_1945_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1310_1945_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1310_1945_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1310_1945_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1310_1945_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1310_1945_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1310_1945_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1310_1945_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1310_1945_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个bitmap类型的bmp变量来读取文件。</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Bitmap(openFileDialog1&nbsp;.FileName&nbsp;);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">新建第二个bitmap类型的bmp2变量，我这里是根据我的程序需要设置的。</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bmp2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Bitmap(</span><span style="color: #800080">1024</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">768</span><span style="color: #000000">,&nbsp;PixelFormat.Format16bppRgb555);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将第一个bmp拷贝到bmp2中</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;draw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Graphics.FromImage(bmp2);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw.DrawImage(bmp,</span><span style="color: #800080">0</span><span style="color: #000000">,</span><span style="color: #800080">0</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pictureBox1.Image&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Image)bmp2&nbsp;;</span><span style="color: #008000">//</span><span style="color: #008000">读取bmp2到picturebox</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;openFileDialog1.FileName;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openFileDialog1.Dispose();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw.Dispose();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.Dispose();</span><span style="color: #008000">//</span><span style="color: #008000">释放bmp文件资源</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></div>
<br />
使用它的方法并没有解决我的问题,因为这里他使用的是创建非索引图像,按文章介绍还有另外一种做法,于是我将显示图片的地方做了一些修改,如下:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ShowImage(PictureBox&nbsp;pic,Image&nbsp;image)<br />
<img id="Codehighlighter1_59_1294_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_59_1294_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_59_1294_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_59_1294_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_59_1294_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_59_1294_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_59_1294_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_59_1294_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_59_1294_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_59_1294_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(image.Width&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;pic.Width&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;image.Height&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;pic.Height)<br />
<img id="Codehighlighter1_145_223_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_145_223_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_145_223_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_145_223_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_145_223_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_145_223_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_145_223_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_145_223_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_145_223_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_145_223_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pic.SizeMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PictureBoxSizeMode.CenterImage;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img id="Codehighlighter1_253_332_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_253_332_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_253_332_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_253_332_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_253_332_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_253_332_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_253_332_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_253_332_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_253_332_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_253_332_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pic.SizeMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PictureBoxSizeMode.StretchImage;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Bitmap)image;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bmp2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Bitmap(bmp.Width,&nbsp;bmp.Height,&nbsp;image.PixelFormat);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle&nbsp;rect&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Rectangle(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;bmp.Width,&nbsp;bmp.Height);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Drawing.Imaging.BitmapData&nbsp;bmpData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.LockBits(rect,&nbsp;System.Drawing.Imaging.ImageLockMode.ReadWrite,<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.PixelFormat);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr&nbsp;ptr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bmpData.Scan0;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bmpData.Stride&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;bmp.Height;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;rgbValues&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[bytes];<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Runtime.InteropServices.Marshal.Copy(ptr,&nbsp;rgbValues,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;bytes);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.UnlockBits(bmpData);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmpData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp2.LockBits(rect,&nbsp;System.Drawing.Imaging.ImageLockMode.ReadWrite,<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp2.PixelFormat);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bmpData.Scan0;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Runtime.InteropServices.Marshal.Copy(rgbValues,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;ptr,&nbsp;bytes);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp2.UnlockBits(bmpData);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pic.Image&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bmp2;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
将返回字节数组的函数做一些修改:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;GetImageArray(System.Drawing.Image&nbsp;image)<br />
<img id="Codehighlighter1_79_276_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_79_276_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_79_276_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_79_276_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_79_276_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_79_276_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_79_276_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_79_276_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_79_276_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_79_276_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.IO.MemoryStream&nbsp;ms&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream();<br />
<font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (info.FormatID.Equals(image.RawFormat.Guid))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Diagnostics.Debug.WriteLine(info.MimeType);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里不能使用image.RawFormat了,因为上面的循环根本就找不到使用上面代码生成的Image的解码器,我理解是因为是拷背生成的位图,压根就不是文件的格式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image.Save(ms, ImageFormat.Jpeg);</font><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;b</span><span style="color: #000000">=</span><span style="color: #000000">ms.ToArray();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Close();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
</div>
</div>
经过以上的代码,是可以正常的执行了,但是还有一个问题就是这里存储的格式硬性的变成了ImageFormat.Jpeg了.暂时还没有找到解决办法.
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1126919.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42140/" target="_blank">[新闻]传IBM将以35亿美元至40亿美元收购北电</a>]]></description></item><item><title>[转].NET技术书籍推荐 </title><link>http://www.cnblogs.com/fxwdl/archive/2008/03/26/1122440.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Wed, 26 Mar 2008 00:59:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/03/26/1122440.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1122440.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/03/26/1122440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1122440.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1122440.html</trackback:ping><description><![CDATA[<p>转自<font face="Verdana">http://www.cnblogs.com/kirinboy/archive/2008/03/25/dotnet_books_recommend.html</font><br />
今天看到dudu号召大家<a href="http://www.cnblogs.com/dudu/archive/2008/03/25/1120574.html" target="_blank">推荐对自己最有帮助的技术图书</a>，在下不才，几年间看过的书籍屈指可数，但有幸的是，所看的书都是经典中的经典。借此post向大家推荐一下。因为都是经典书，所以没什么新意，其他人推荐的也不外乎这几本。</p>
<p>1.<img alt="" src="http://images.china-pub.com/ebook10000-15000/13534/zcover.jpg" align="right" /> </p>
<p>书名：Microsoft .NET框架程序设计（修订版）</p>
<p>作者：Jeffrey Richter</p>
<p>译者：李建忠</p>
<p>出版日期：2003 年11月</p>
<p>出版社：清华大学出版社</p>
<p>推荐理由：框架设计是我看的第一本真正意义上的.NET书籍，之前看过很多，但都是工具类的。如果仅仅把.NET作为开发程序的工具，那些书就足够了。但是.NET绝不仅仅是个工具，它是一种思想、一个平台。要想深入学习，必须对其Framework有所了解。《Microsoft .NET框架程序设计（修订版）》无疑是学习.NET Framework最好的一本。李健忠老师的翻译通俗流畅，并且字里行间流露着他对.NET的深刻理解。这本书陪伴我度过了研究生期间很多无聊的课程。不过初学者看这本书开始也许会很费劲，有一次一个同搞.NET的同学拿过去翻了翻就扔给了我，说：看不懂。</p>
<p>&nbsp;</p>
<p>2.<img alt="" src="http://images.china-pub.com/ebook10000-15000/12901/zcover.jpg" align="right" /> </p>
<p>书名：重构：改善既有代码的设计（中文版）</p>
<p>作者：Martin Fowler</p>
<p>译者：侯捷，熊节</p>
<p>出版日期：2003 年9月</p>
<p>出版社：中国电力出版社</p>
<p>推荐理由： 重构，这个既简单又深奥的概念直到现在仍然吸引着广大设计爱好者。几年前当我几乎被这个名词弄晕的时候，我找到了这本书——重构的诞生地。它同样是我的&#8220;课堂书籍&#8221;。与《框架设计》不同的是，它的概念和理论十分简单，即使对编程只有一点点的认识，也能很惬意的阅读本书。因为它所阐述的，就是我们程序员平时所做的——修改代码。但如何更好的修改，使其更符合OO标准，又是一个非常复杂的过程。</p>
<p>&nbsp;</p>
<p>3.<img alt="" src="http://images.china-pub.com/ebook10000-15000/13569/zcover.jpg" align="right" /> </p>
<p>书名：敏捷软件开发：原则、模式与实践</p>
<p>作者：Robert C. Martin</p>
<p>译者：邓辉</p>
<p>出版日期：2003 年9月</p>
<p>出版社：清华大学出版社</p>
<p>推荐理由： Bob大叔最脍炙人口的作品。如果你看过《设计模式》与《重构》，那么推荐你接着看这本，对于设计模式的理解就会上升一个层次。熟练掌握各种设计原则，我们就不必再死记那些刻板的模式。只要我们的设计复合原则，就是一个良好的设计。《设计模式》、《重构》和《敏捷软件开发》是设计爱好者必读的三本书。</p>
<p>&nbsp;</p>
<p>4.<img alt="" src="http://images.china-pub.com/ebook35001-40000/36237/zcover.jpg" align="right" /> <br />
书名：ASP.NET 2.0揭秘</p>
<p>作者：Stephen Walther</p>
<p>译者：谭振林，黎志，朱兴林，马士杰</p>
<p>出版日期：2007 年10月</p>
<p>出版社：人民邮电出版社</p>
<p>推荐理由：将近一年没有搞ASP.NET了，因此这本书买来也束之高阁。但此书1.1版本却令我印象深刻。当年就是那本绿皮的《ASP.NET揭秘》把我领进了ASP.NET的殿堂。我甚至一度认为其它的ASP.NET书都是垃圾（特别是清华大学出版的Wrox的红皮书，其实是翻译的太烂）。虽然2.0版本的中文版姗姗来迟，但是我仍然认为它值得收藏。特别是四位国内MVP的加盟，一定不会让人失望。越来越多的技术高手加入到写书译书的队伍中来，会彻底改变国内翻译书籍没法看的尴尬局面。</p>
<p>&nbsp;</p>
<p>5.<img alt="" src="http://images.china-pub.com/ebook35001-40000/36020/zcover.jpg" align="right" /> </p>
<p>书名：Head First设计模式（中文版）</p>
<p>作者：Eric Freeman，Elisabeth Freeman，With Kathy ierra，Bert Bates </p>
<p>译者：O'Reilly Taiwan公司</p>
<p>出版日期：2007 年9月</p>
<p>出版社： 中国电力出版社</p>
<p>推荐理由：这是一本让人拍案叫绝的书，它用浅显风趣的语言和别具一格的表现形式，把《设计模式》中天书一般的理论展现的精妙绝伦。如果你对设计模式还一知半解，或被《设计模式》中晦涩的文字搞得晕头转向，那么赶快来阅读本书吧。然而从某种意义上说，《Head First设计模式》是一本不能看的书，因为你一旦看过，会对其它的书倍感失望。所谓曾经沧海难为水是也。</p>
<p>6.<img alt="" src="http://images.china-pub.com/ebook30001-35000/32561/zcover.jpg" align="right" /> </p>
<p>书名：重构与模式</p>
<p>作者：Joshua Kerievsky </p>
<p>译者：杨光，刘基诚</p>
<p>出版日期：2006 年12月</p>
<p>出版社：人民邮电出版社</p>
<p>推荐理由：很遗憾，我是在看完《Head First设计模式》后看得这本书，因此对其语言的易读性很是失望。甚至一度把它放回了书架上。但是这并不代表它不是一本经典书。它将重构与模式完美的结合，使我们明白了设计是按照设计原则将代码重构成模式的过程。</p>
<p>&nbsp;</p>
<p>7.<img alt="" src="http://images.china-pub.com/ebook35001-40000/37188/zcover.jpg" align="right" /> <br />
书名：C#和.NET 2.0 实战:平台、语言与框架</p>
<p>作者：Patrick Smacchia </p>
<p>译者：施凡，李永伦，谭颖华，徐宁</p>
<p>出版日期：2008 年1月</p>
<p>出版社：人民邮电出版社</p>
<p>推荐理由：不管你使用什么语言进行开发，都希望手头有一本大而全的参考书。否则东一本框架、西一本语法，南一本WinForm，北一本ASP.NET，会把人搞得很崩溃。尽管Google和百度在绝大多数情况下可以解决问题，但是万一没有网络呢？《C#和.NET 2.0 实战》就是这样一本书，它包罗.NET的万象，编程时遇到任何问题都可以先翻开本书寻找答案。如果你是一个.NET程序员，案边放这样一本书是再适合不过了。我在读书小组<a href="http://space.cnblogs.com/group/topic/764/" target="_blank">推荐</a>过这本书。</p>
<p>&nbsp;</p>
<p>8.<img alt="" src="http://images.china-pub.com/ebook15001-20000/19923/zcover.jpg" align="right" /> </p>
<p>书名：企业应用架构模式</p>
<p>作者：Martin Fowler</p>
<p>译者：王怀民，周斌 </p>
<p>出版日期：2004 年7月</p>
<p>出版社：机械工业出版社</p>
<p>推荐理由： 秉承Martin Fowler一贯的通俗易懂的写作风格，用最浅显的语言描述复杂的概念。书中所列举的各种模式，我们肯定都或多或少使用过。本书是分层设计的指导书。</p>
<p>&nbsp;</p>
<p>9. <img alt="" src="http://images.china-pub.com/ebook30001-35000/30969/zcover.jpg" align="right" /></p>
<p>书名：.NET 设计规范——.NET约定、惯用法与模式</p>
<p>作者：Krzysztof Cwalina，Brad Abrams </p>
<p>译者：葛子昂</p>
<p>出版日期：2006 年7月</p>
<p>出版社： 人民邮电出版社</p>
<p>推荐理由： 你是否修改过别人的代码？你是否因为混乱的命名规则和晦涩的变量名称抓狂？如果所有.NET程序员都读过《.NET 设计规范》，这一切也许就不会发生了。它虽然名称为&#8220;Framework Design Guidelines&#8221;，但实际上不仅仅是指导我们如何编写框架，它本身就是.NET Framework的设计规范。我们平时在做任何开发，哪怕是最简单的工具时，也应该遵循书中所提出的标准。</p>
<p>&nbsp;</p>
<p>10.<img alt="" src="http://images.china-pub.com/ebook25001-30000/25961/zcover.jpg" align="right" /> </p>
<p>书名：设计模式：可复用面向对象软件的基础</p>
<p>作者：Erich Gamma，Richard Helm，Ralph Johnson，John Vlissides</p>
<p>译者：李英军，马晓星，蔡敏，刘建中</p>
<p>出版日期：2004 年9月</p>
<p>出版社： 机械工业出版社</p>
<p>推荐理由：之所以最后推荐本书，并不是因为它不如前几本，相反，它应该是所有设计爱好者的第一本书。但它太晦涩了，它就像是一本武林秘籍，不是所有人都能参透其中的奥秘。然而幸好很多高手练成绝世武功后，把他们的心得写了出来，这些心得要好理解得多。因此《Head First设计模式》、《设计模式解析》、《Java与模式》等应该称为设计模式初学者的首选。</p>
<div id="MySignature">冠亿科技,尽心尽力 <br />
<br />
另外,在<font face="Verdana"><a href="http://www.cnblogs.com/dudu/archive/2008/03/25/1120574.html">http://www.cnblogs.com/dudu/archive/2008/03/25/1120574.html</a>也有很多的书籍推荐.是Dudu老大发起的.</font></div>
<img src ="http://www.cnblogs.com/fxwdl/aggbug/1122440.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42139/" target="_blank">[新闻]Google卫星已经开始工作</a>]]></description></item><item><title>IT职场里的某些人感悟(欢迎各抒己见) [转]</title><link>http://www.cnblogs.com/fxwdl/archive/2008/03/11/1100563.html</link><dc:creator>毁于随</dc:creator><author>毁于随</author><pubDate>Tue, 11 Mar 2008 06:44:00 GMT</pubDate><guid>http://www.cnblogs.com/fxwdl/archive/2008/03/11/1100563.html</guid><wfw:comment>http://www.cnblogs.com/fxwdl/comments/1100563.html</wfw:comment><comments>http://www.cnblogs.com/fxwdl/archive/2008/03/11/1100563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/fxwdl/comments/commentRss/1100563.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/fxwdl/services/trackbacks/1100563.html</trackback:ping><description><![CDATA[<p>1.一个企业，80％的价值是由20％的人创造的，其他80％的人只创造了20％的价值，而他们最大的作用就是刺激这20％的人创造出 80％的价值，而能获得企业肯定和好处，也仅仅是这20％的人，所以，想要站的稳，爬的高，就只有成为这20％中的一员，这是千古不变的真理，所谓的团队，说粗俗点就是拉帮结派，兄弟，现实一点，人的社会就是这样，看看历史如此，现在如此，将来还是如此，不管职场，管场，都是如此，呵呵，一点浅见。<br />
<br />
2.过人的头脑比技术更重要！有了技术你可以独当一面，可是懂了权术，你就可以独挡八面了！钱花花的来了，多看看书，厚黑学，鬼谷子之类的，保证有好处，揣测别人的心理啊！ <br />
<br />
3.人本来就是复杂的，世界上没有绝对的好人，也没有绝对的坏蛋，好与坏只是一念之差。人人都可以做好人，有时候，人人也都可以成为坏蛋，这个世界上，没有永远的敌人，也没有永久的朋友，只有永恒不变的利益。但是你不能欺骗自己的兄弟！ <br />
<br />
4.等咸鱼翻身的时候，也就是这锅汤煮熟的时候了！做好人有什么用？人善被人欺，马善被人骑，他妈的，一代天子一朝臣，这是自古不变的道理。谁不想将重权交给忠于自己的人来掌握！ <br />
<br />
5.智，谋天下。勇，争天下。这个世界上，没有什么东西是得不到的，只有抓不住而从掌心中悄然流走的。做人要讲究城府，在你未成为三军统帅之前，不要暴露自己，等你成为将军了，大刀阔斧的给杀！但是要记住：先纳新，后吐故！如果先吐故，势必完蛋！康熙用此法一统朝政！ <br />
<br />
6.不管他是谁，不管他的为人如何，只要对我们有利，就应该想办法让他为我们做事！不是不报时候未到！ <br />
<br />
7.自己要懂技术，还要学会驾驭权术。<br />
<br />
8.鄙人最近看了小说《无以言退》，里面经典话很多，对你这种情况，可以录几句：&#8220;走很容易，留下来才是修行&#8221;，&#8220;不要说别人卑鄙狡诈，只能说自己无知愚蠢&#8221; ，&#8220;可以忍受物质的匮乏，但要学会在新时代下竞争的残酷。&#8221; <br />
<br />
9.我说的这个高管，我来这个公司，就是他把我从另一家当地比较有规模的企业里生生的挖过去的，因为他知道我们这里另一家通过了cmmi&nbsp;L3级的企业就是我负责EPG里非常重要的工作，而且是已经获得SEI认证的cmmi定级评估员，所以他死活要把我挖过去，我过去后，由于cmmi当时是这个公司里的一项很重要的工作，所以我的工作是直接像他汇报。同时，我过来也不是什么很基层的员工，是质量管理部经理，所以对他汇报也符合汇报机制，不存在越级，所以他对我的工作是很了解的，不过由于这个公司里的软件部门从技术到工程管理简直垃圾的不是一般，一个项目经理基本没有听说过什么WBS是什么，连V模型都不知道是怎么回事。给他们一个瀑布模型的计划日程，他们都看不出来是什么生命周期，像什么配置管理，集成构建，需求管理，需求开发，分析设计，测试，等等等等，更是做得一踏糊涂。我来之后名称是一个部门经理，但是下大力气作了大量的一线工作，很多事情是一手一手教，就连个接口记录和管理这样的事情，我要给技术人员手把手的教，如何规划设计，如何识别接口（这里不是说的Java等语言里的接口类型定义），如何记录和管理，以及发展对接口的设计等等。不然他们在需求里说，&#8220;XX系统和XX子系统需要接口&#8221;，在概要设计里还是这句话，到了详细设计里，还是这样一句话。这种事情多得数不胜数。在项目管理方面就更不要说了，教项目经理写项目计划和做日程安排的时候，简直是我说一句，他们就往计划里写一句，同时我还要解释为什么这么写，日程的安排如何去符合生命周期，任务的分配和进度控制如何管理，配置管理如何设计符合生命周期的配置结构，等等等等，还有测试，我兼任测试部门负责人，对测试人员作了的培训，手把手的教他们如何设计测试用例。&nbsp;所以，我的所有工作他是看得到的，企业由于我的存在发生的变化也是有目共睹的。但是，我过来大概半年后，这个高管就调任其他部门做管理了，新来的软件部经理来了之后，倒是对我的没有怎么着，因为当时cmmi还处于非常紧张的工作阶段，他当时不能动我，但在这期间，软件部有4个下属部门经理，他赶走了另外2个，到了cmmi通过了，我就是成了第三个，他容不下不属于自己人的有能力的人。你说得不错，这就是政治斗争，一朝天子一朝臣，但是拿我们这些做实事有没有什么野心的人来做他政治斗争的牺牲品，我觉得很郁闷，觉得这个圈子里很肮脏。&nbsp;<br />
<br />
10.公司越大越不会要高手。你看看世界500强，有哪个高手进去了？世界500强的技术，大部分都是吞并小公司得来的。公司越大人事关系越复杂。你要知道你不是直接跟老板打交道的，你的表现在中层向上层回报的时候就全变样了。但大公司的收入高。所以，如果给人打工，最好不要露出你的本事太强。特别是在大公司。当然小公司露本事了，不会有好处，收入不会高了。但太大的坏处也没有。<br />
<br />
11.&nbsp;有时候，程序员应该心胸开阔点，不要觉得有人比自己技术强，就觉得不舒服，不服气 。没有这一点很难站在领导岗位上，换个角度想想，不是这个社会怎么着了，而往往是自己的心胸变的狭窄了，你无法左右这个社会，但是你可以左右你自己。勇于认可别人是一种美德，也是受到别人尊重的基础！<br />
<br />
12.人在屋檐下，不得不低头，要学会夹起尾巴做人。&nbsp;必要的时候，反咬一口才是真的。伯乐不是那么好当的，如果你威胁到了他的利益，你说他会让你好过吗？开国皇帝杀重臣的是普遍现象，反倒是稀里糊涂的人能长寿。<br />
<br />
13.看《明朝那些事儿》感觉到，真正有发展的都是既能干又能混的。<br />
<br />
14.管理需要跟人打好关系，上头〉下级〉平级。如果你不想升迁，想做个普通的技术人员，你得私下跟你的新上司说，丑话就是表忠心。男人三件事：入对行，跟对人，做对事。好好琢磨吧。<br />
<br />
15.对于CMM，我觉得对实际工作没什么用。我在2003年的时候，在某个世界顶级的通讯设备生产商的某个部门里参加了该部门的CMM流程制定工作，在一帮老印下面工作了一段时间。后来因为该部门持续亏损，公司决定退出这个领域，把整个部门给卖了，所以我跳槽到另外一家公司，属于该领域的上游厂商，接触了很多这个领域里小的公司，看到其中有些公司从10几个人开始发展，最后2000人，6000人，分拆，上市，茁壮成长。而以前那个部门被出售以后，还在不停的亏损。我觉得CMM那些鬼东西是其中的一个原因。这些流程极大的拉长了开发周期。在你做了需求分析，概要分析，详细设计，单元测试计划，集成测试计划，开了无数的review&nbsp;meeting，总结出了一堆的matrix，虽然你投入的人力是别人的两三倍，虽然你还迭代开发，来缩短周期，但是你的产品周期还是别人的四五倍。这不是夸张，的确是四到五倍。CMM只适合那些几乎完全垄断，没有竞争压力下生存的企业。印度人CMM搞得很好，但是他们还是只能做做代工，而且我接触过的印度人的代码，质量极其低下，完全没有保障。我现在在另一家公司，它倒是很庞大，在这个领域很垄断，但是没有CMM，甚至连像样的schedule都没有，给一个大致的项目日程，几个重要的milestone，工程师自己的schedule，自己看着办，开始的时候让我很瞠目。<br />
<br />
16.cmm/cmmi只是一套模型，就像其他的很多行业，如：银行业、建筑业、汽车工业、或者航空业，需要一套衡量其技术和管理水平的标尺一样，它只是一把衡量软件业管理和技术水平的标尺，当然，为了使决定采用cmm/cmmi的企业更好的实施cmm/cmmi所提出的目标，SEI将软件研发生产领域的诸多方面作了逐级的解释和有机的结合，形成了从cmm到cmmi的不断演化完善的各种版本，提出研发cmm/cmmi需求的人和研发cmm/cmmi的人，他们无非是希望软件-----这个相对较新的技术产业，也能够逐步的成熟起来，能够适应软件应用相关行业对软件日益提高的各种要求。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;cmm/cmmi是在经历了软件危机之后，在大量的业内企业和专家在为了克服软件危机而做了大量的理论研究和实践之后，系统的总结的一种软件的方法论，不同的地域，不同的企业，不同的商业目标，不同的技术类型，不同的应用要求，这导致cmm/cmmi不可能非常具体的为我们提供某种直接的方法，因为它面向全世界所有的软件企业和他们研发的所有项目，所以，cmm/cmmi是一个高度抽象的模型，它所提出的目标和实践要求，也是在非常高度的抽象上的，换句话说，它为我们指出了目标，给我们说了要做什么，但是，怎么做，这就是企业自身去实例话这写目标和实践的东西了。我的意思就是说，在同一个cmm/cmmi目标下，不同的企业，有的成功，有的失败，这完全是自己的做法不同，这很正常，如果失败了就在cmm/cmmi上找原因，那么你看看人家成功的呢？是不是人家的成功和cmm/cmmi一点关系没有？？所以，要客观公正的看待cmm/cmmi。&nbsp;这里我要再谈谈软件危机，什么是软件危机？如果项目预算准确，产品质量可靠，成本控制到位，客户笑容满面，一派和谐祥和的大家发财的局面，这叫软件危机？？？而很多人提到软件业的困难的时候就会说，这是我们中国的国情，我们这里项目紧，周期短，开发人员技术不怎么样，还经常无能控制得住成本，客户的需求变更很多很无理。言下之意，就我们中国是这样，在国外一切都不是这样，国外的软件开发人员日子都很好过，诚然，现在放眼世界，发达国家的软件行业各方各面都要优于我们目前的状况，但是这是人家与生俱来的吗？？难道&#8220;软件危机&#8221;一词的出现不是在60年代的西方，而是在今天的中国吗？？？4-5十千，人家同样经历着我们现在经历的一切，这，就是软件危机。如果说现在还有人cmm/cmmi只适合那些市场环境良好，企业素质优秀的地方玩，那就是大错特错了，cmm/cmmi就是为了解决60年代后的软件危机而诞生的，换句话说，就是用在我们现在这样的行业环境下的东西，当然，实践有成功，有失败，经验和教训并存，如果没有失败的实践者去当炮灰，也就换不来后来人吸取教训必然无谓的失败，唯有这样，我们的行业环境也才能像欧美发达国家的IT业一样，经历阵痛，涅磐重生。<br />
<br />
17.做技术的人，能努力干活了，好技术留着以后自己创业的时候再用。要多用心思在跟人斗上。因为你要知道你是在打工，不是在给自己干。特别在500强的大公司更是如此。有人捣鬼，你就要捣更大的鬼。特别是大公司，每个人都有自己的算盘。他们都不是从公司利益出发的。这些话都是肺腑之言，你要好好体会。别人不会告诉你这些，只有你载跟斗了才能体会到。&nbsp;<br />
<br />
18.根据个人经历观察，高层才会重视CMMI，下面一线研发人员包括PM都比较抵触，特别是任务紧时最怕弄些繁文缛节。可能根本原因还是QA部门与项目规划没沟通好吧，让coder们又要马儿跑又要马儿不吃草。<br />
<br />
19.这个世界从来就没有公平过。我原来也以为只要把事情做好就可以了。可现实环境中，总会存在很多因素阻止你把事情做好！这个时候，就不光是修炼自己的内功了，还要学习很多的策略，和别人相处的方式。只有这样才能把事情做好。也就是外圆内方，但自己内心需要坚持的东西还要坚持。在任何时候都要保持虚心，多做事，少说话，特别是抱怨是没有用的，反而让你自己迷失了自己。将每一次挫折都看作一种成长！相信你总会实现自己的理想！&nbsp;<br />
<br />
20.&nbsp;关于CMM，有一点很想说的。 本人曾经亲身参与过一个500人规模的软件公司CMM4级的评估，自己的项目也作为参评项目并且得到认可，不过我个人对于CMM并不看好，原因如下： 1，CMM的来源其实是美国军方，为了能够对军方超大规模的项目研发进行控制以及评估，而设计的一个模型，由卡耐基梅隆的软件工程研究所完成。这个模型的初衷就是要不计成本的完善软件质量，因为军方的很多软件项目（比如航天飞机的控制软件）不允许出现错误的。至于说CMM模型是否能够应用到民用项目中来，还有待探讨，最关键是CMM产生的成本很高，不仅仅是时间的问题，还有培训、实施等一系列的问题。我个人的观点除了大规模量产的产品（比如手机）中应用CMM会比较适合，其他类型的项目应用这个模型会得不偿失，毕竟软件项目做到最后还是利润摆在第一位的。 2，至于说能力太强，我觉得每个人的能力就像是那个&#8220;木桶原理&#8221;一样，由最短的那根木头决定，这么多人不认可你肯定有你自己的原因在里面，不要总是看到别人的不是。&#8220;让别人认可你&#8221;也是一种很重要的能力，如果你真的能力那么强，雇用你能够给公司带来大笔的收入，哪个老板会不愿意给你付薪水呢？而且要是真那么有本事，找投资商自己开公司也不是什么很难的事情。<br />
<br />
21.狼生活再战场，狗生活在职场。能力最强，也要低调。<br />
<br />
22.事业靠利用人力，不是靠朋友。人和人就是互相利用，在一个单位里同行就没什么朋友，都等看你笑话呐！ 生存靠手段而不是